{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:09:10.489853100Z",
          "start_time": "2024-07-18T03:09:06.122513400Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "tAqwkTzMrXyU",
        "outputId": "5544ac99-8e08-4ea2-959e-da7617dc3780"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "sys.version_info(major=3, minor=11, micro=11, releaselevel='final', serial=0)\n",
            "matplotlib 3.10.0\n",
            "numpy 1.26.4\n",
            "pandas 2.2.2\n",
            "sklearn 1.6.0\n",
            "torch 2.5.1+cu121\n",
            "cuda:0\n"
          ]
        }
      ],
      "source": [
        "import matplotlib as mpl\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "import numpy as np\n",
        "import sklearn\n",
        "import pandas as pd\n",
        "import os\n",
        "import sys\n",
        "import time\n",
        "from tqdm.auto import tqdm\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "\n",
        "print(sys.version_info)\n",
        "for module in mpl, np, pd, sklearn, torch:\n",
        "    print(module.__name__, module.__version__)\n",
        "\n",
        "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
        "print(device)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CfkFN_SVrXyW"
      },
      "source": [
        "## 准备数据"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:09:23.030487800Z",
          "start_time": "2024-07-18T03:09:22.690908200Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "q5f75HM1rXyX",
        "outputId": "1ad029f5-c9b7-4940-bf39-42ed78edbbf0"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            ".. _california_housing_dataset:\n",
            "\n",
            "California Housing dataset\n",
            "--------------------------\n",
            "\n",
            "**Data Set Characteristics:**\n",
            "\n",
            ":Number of Instances: 20640\n",
            "\n",
            ":Number of Attributes: 8 numeric, predictive attributes and the target\n",
            "\n",
            ":Attribute Information:\n",
            "    - MedInc        median income in block group\n",
            "    - HouseAge      median house age in block group\n",
            "    - AveRooms      average number of rooms per household\n",
            "    - AveBedrms     average number of bedrooms per household\n",
            "    - Population    block group population\n",
            "    - AveOccup      average number of household members\n",
            "    - Latitude      block group latitude\n",
            "    - Longitude     block group longitude\n",
            "\n",
            ":Missing Attribute Values: None\n",
            "\n",
            "This dataset was obtained from the StatLib repository.\n",
            "https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.html\n",
            "\n",
            "The target variable is the median house value for California districts,\n",
            "expressed in hundreds of thousands of dollars ($100,000).\n",
            "\n",
            "This dataset was derived from the 1990 U.S. census, using one row per census\n",
            "block group. A block group is the smallest geographical unit for which the U.S.\n",
            "Census Bureau publishes sample data (a block group typically has a population\n",
            "of 600 to 3,000 people).\n",
            "\n",
            "A household is a group of people residing within a home. Since the average\n",
            "number of rooms and bedrooms in this dataset are provided per household, these\n",
            "columns may take surprisingly large values for block groups with few households\n",
            "and many empty houses, such as vacation resorts.\n",
            "\n",
            "It can be downloaded/loaded using the\n",
            ":func:`sklearn.datasets.fetch_california_housing` function.\n",
            "\n",
            ".. rubric:: References\n",
            "\n",
            "- Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
            "  Statistics and Probability Letters, 33 (1997) 291-297\n",
            "\n",
            "(20640, 8)\n",
            "(20640,)\n"
          ]
        }
      ],
      "source": [
        "from sklearn.datasets import fetch_california_housing\n",
        "\n",
        "housing = fetch_california_housing(data_home='data')\n",
        "print(housing.DESCR)\n",
        "print(housing.data.shape)\n",
        "print(housing.target.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:09:54.024390600Z",
          "start_time": "2024-07-18T03:09:54.006741600Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "oB5Vu2merXyX",
        "outputId": "0df03026-9a66-4a12-805f-5cea1f42ce9f"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "array([[ 8.32520000e+00,  4.10000000e+01,  6.98412698e+00,\n",
            "         1.02380952e+00,  3.22000000e+02,  2.55555556e+00,\n",
            "         3.78800000e+01, -1.22230000e+02],\n",
            "       [ 8.30140000e+00,  2.10000000e+01,  6.23813708e+00,\n",
            "         9.71880492e-01,  2.40100000e+03,  2.10984183e+00,\n",
            "         3.78600000e+01, -1.22220000e+02]])\n",
            "--------------------------------------------------\n",
            "array([4.526, 3.585])\n"
          ]
        }
      ],
      "source": [
        "# print(housing.data[0:5])\n",
        "import pprint  #打印的格式比较 好看\n",
        "\n",
        "pprint.pprint(housing.data[0:2])\n",
        "print('-'*50)\n",
        "pprint.pprint(housing.target[0:2])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:10:11.560482300Z",
          "start_time": "2024-07-18T03:10:11.475280800Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "hHSc4DiUrXyY",
        "outputId": "540fbf67-5f40-4d4c-e258-a4d9e93d1b5e"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "(11610, 8) (11610,)\n",
            "(3870, 8) (3870,)\n",
            "(5160, 8) (5160,)\n"
          ]
        }
      ],
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "#拆分训练集和测试集，random_state是随机种子,同样的随机数种子，是为了得到同样的随机值\n",
        "x_train_all, x_test, y_train_all, y_test = train_test_split(\n",
        "    housing.data, housing.target, random_state = 7)\n",
        "x_train, x_valid, y_train, y_valid = train_test_split(\n",
        "    x_train_all, y_train_all, random_state = 11)\n",
        "# 训练集\n",
        "print(x_train.shape, y_train.shape)\n",
        "# 验证集\n",
        "print(x_valid.shape, y_valid.shape)\n",
        "# 测试集\n",
        "print(x_test.shape, y_test.shape)\n",
        "\n",
        "dataset_maps = {\n",
        "    \"train\": [x_train, y_train],\n",
        "    \"valid\": [x_valid, y_valid],\n",
        "    \"test\": [x_test, y_test],\n",
        "} #把3个数据集都放到字典中\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "numpy.ndarray"
            ]
          },
          "metadata": {},
          "execution_count": 5
        }
      ],
      "source": [
        "type(x_train)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:17:22.264621900Z",
          "start_time": "2024-07-18T03:17:22.257794900Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "mhE2HNiVrXyY",
        "outputId": "c9c48314-5667-4b8e-c52b-9f9b53ef8073"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:16:30.331411900Z",
          "start_time": "2024-07-18T03:16:30.297939600Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 80
        },
        "id": "XAx8QzoorXyY",
        "outputId": "46d37365-5388-4a4a-ecf1-298876bd59b3"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "StandardScaler()"
            ],
            "text/html": [
              "<style>#sk-container-id-1 {\n",
              "  /* Definition of color scheme common for light and dark mode */\n",
              "  --sklearn-color-text: #000;\n",
              "  --sklearn-color-text-muted: #666;\n",
              "  --sklearn-color-line: gray;\n",
              "  /* Definition of color scheme for unfitted estimators */\n",
              "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
              "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
              "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
              "  --sklearn-color-unfitted-level-3: chocolate;\n",
              "  /* Definition of color scheme for fitted estimators */\n",
              "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
              "  --sklearn-color-fitted-level-1: #d4ebff;\n",
              "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
              "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
              "\n",
              "  /* Specific color for light theme */\n",
              "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
              "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-icon: #696969;\n",
              "\n",
              "  @media (prefers-color-scheme: dark) {\n",
              "    /* Redefinition of color scheme for dark theme */\n",
              "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
              "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-icon: #878787;\n",
              "  }\n",
              "}\n",
              "\n",
              "#sk-container-id-1 {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 pre {\n",
              "  padding: 0;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-hidden--visually {\n",
              "  border: 0;\n",
              "  clip: rect(1px 1px 1px 1px);\n",
              "  clip: rect(1px, 1px, 1px, 1px);\n",
              "  height: 1px;\n",
              "  margin: -1px;\n",
              "  overflow: hidden;\n",
              "  padding: 0;\n",
              "  position: absolute;\n",
              "  width: 1px;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-dashed-wrapped {\n",
              "  border: 1px dashed var(--sklearn-color-line);\n",
              "  margin: 0 0.4em 0.5em 0.4em;\n",
              "  box-sizing: border-box;\n",
              "  padding-bottom: 0.4em;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-container {\n",
              "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
              "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
              "     so we also need the `!important` here to be able to override the\n",
              "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
              "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
              "  display: inline-block !important;\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-text-repr-fallback {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              "div.sk-parallel-item,\n",
              "div.sk-serial,\n",
              "div.sk-item {\n",
              "  /* draw centered vertical line to link estimators */\n",
              "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
              "  background-size: 2px 100%;\n",
              "  background-repeat: no-repeat;\n",
              "  background-position: center center;\n",
              "}\n",
              "\n",
              "/* Parallel-specific style estimator block */\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item::after {\n",
              "  content: \"\";\n",
              "  width: 100%;\n",
              "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
              "  flex-grow: 1;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel {\n",
              "  display: flex;\n",
              "  align-items: stretch;\n",
              "  justify-content: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
              "  align-self: flex-end;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
              "  align-self: flex-start;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
              "  width: 0;\n",
              "}\n",
              "\n",
              "/* Serial-specific style estimator block */\n",
              "\n",
              "#sk-container-id-1 div.sk-serial {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "  align-items: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  padding-right: 1em;\n",
              "  padding-left: 1em;\n",
              "}\n",
              "\n",
              "\n",
              "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
              "clickable and can be expanded/collapsed.\n",
              "- Pipeline and ColumnTransformer use this feature and define the default style\n",
              "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
              "*/\n",
              "\n",
              "/* Pipeline and ColumnTransformer style (default) */\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable {\n",
              "  /* Default theme specific background. It is overwritten whether we have a\n",
              "  specific estimator or a Pipeline/ColumnTransformer */\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "/* Toggleable label */\n",
              "#sk-container-id-1 label.sk-toggleable__label {\n",
              "  cursor: pointer;\n",
              "  display: flex;\n",
              "  width: 100%;\n",
              "  margin-bottom: 0;\n",
              "  padding: 0.5em;\n",
              "  box-sizing: border-box;\n",
              "  text-align: center;\n",
              "  align-items: start;\n",
              "  justify-content: space-between;\n",
              "  gap: 0.5em;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
              "  font-size: 0.6rem;\n",
              "  font-weight: lighter;\n",
              "  color: var(--sklearn-color-text-muted);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
              "  /* Arrow on the left of the label */\n",
              "  content: \"▸\";\n",
              "  float: left;\n",
              "  margin-right: 0.25em;\n",
              "  color: var(--sklearn-color-icon);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "/* Toggleable content - dropdown */\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content {\n",
              "  max-height: 0;\n",
              "  max-width: 0;\n",
              "  overflow: hidden;\n",
              "  text-align: left;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content pre {\n",
              "  margin: 0.2em;\n",
              "  border-radius: 0.25em;\n",
              "  color: var(--sklearn-color-text);\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
              "  /* Expand drop-down */\n",
              "  max-height: 200px;\n",
              "  max-width: 100%;\n",
              "  overflow: auto;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
              "  content: \"▾\";\n",
              "}\n",
              "\n",
              "/* Pipeline/ColumnTransformer-specific style */\n",
              "\n",
              "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator-specific style */\n",
              "\n",
              "/* Colorize estimator box */\n",
              "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
              "#sk-container-id-1 div.sk-label label {\n",
              "  /* The background is the default theme color */\n",
              "  color: var(--sklearn-color-text-on-default-background);\n",
              "}\n",
              "\n",
              "/* On hover, darken the color of the background */\n",
              "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "/* Label box, darken color on hover, fitted */\n",
              "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator label */\n",
              "\n",
              "#sk-container-id-1 div.sk-label label {\n",
              "  font-family: monospace;\n",
              "  font-weight: bold;\n",
              "  display: inline-block;\n",
              "  line-height: 1.2em;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label-container {\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              "/* Estimator-specific */\n",
              "#sk-container-id-1 div.sk-estimator {\n",
              "  font-family: monospace;\n",
              "  border: 1px dotted var(--sklearn-color-border-box);\n",
              "  border-radius: 0.25em;\n",
              "  box-sizing: border-box;\n",
              "  margin-bottom: 0.5em;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "/* on hover */\n",
              "#sk-container-id-1 div.sk-estimator:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
              "\n",
              "/* Common style for \"i\" and \"?\" */\n",
              "\n",
              ".sk-estimator-doc-link,\n",
              "a:link.sk-estimator-doc-link,\n",
              "a:visited.sk-estimator-doc-link {\n",
              "  float: right;\n",
              "  font-size: smaller;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1em;\n",
              "  height: 1em;\n",
              "  width: 1em;\n",
              "  text-decoration: none !important;\n",
              "  margin-left: 0.5em;\n",
              "  text-align: center;\n",
              "  /* unfitted */\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted,\n",
              "a:link.sk-estimator-doc-link.fitted,\n",
              "a:visited.sk-estimator-doc-link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "/* Span, style for the box shown on hovering the info icon */\n",
              ".sk-estimator-doc-link span {\n",
              "  display: none;\n",
              "  z-index: 9999;\n",
              "  position: relative;\n",
              "  font-weight: normal;\n",
              "  right: .2ex;\n",
              "  padding: .5ex;\n",
              "  margin: .5ex;\n",
              "  width: min-content;\n",
              "  min-width: 20ex;\n",
              "  max-width: 50ex;\n",
              "  color: var(--sklearn-color-text);\n",
              "  box-shadow: 2pt 2pt 4pt #999;\n",
              "  /* unfitted */\n",
              "  background: var(--sklearn-color-unfitted-level-0);\n",
              "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted span {\n",
              "  /* fitted */\n",
              "  background: var(--sklearn-color-fitted-level-0);\n",
              "  border: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link:hover span {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link {\n",
              "  float: right;\n",
              "  font-size: 1rem;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1rem;\n",
              "  height: 1rem;\n",
              "  width: 1rem;\n",
              "  text-decoration: none;\n",
              "  /* unfitted */\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "#sk-container-id-1 a.estimator_doc_link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>StandardScaler()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>StandardScaler</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>StandardScaler()</pre></div> </div></div></div></div>"
            ]
          },
          "metadata": {},
          "execution_count": 6
        }
      ],
      "source": [
        "from sklearn.preprocessing import StandardScaler\n",
        "\n",
        "\n",
        "\n",
        "scaler = StandardScaler() #标准化\n",
        "scaler.fit(x_train) #fit和fit_transform的区别，fit是计算均值和方差，fit_transform是先fit，然后transform"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "()"
            ]
          },
          "metadata": {},
          "execution_count": 7
        }
      ],
      "source": [
        "np.array(1).shape"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:24:29.260017700Z",
          "start_time": "2024-07-18T03:24:29.252881600Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "frnmdWLcrXyZ",
        "outputId": "898c4f19-3cae-485d-9489-9a5b31f3f510"
      }
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "l3FM8I7VrXyZ"
      },
      "source": [
        "### 构建数据集"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:29:08.973115500Z",
          "start_time": "2024-07-18T03:29:08.960843100Z"
        },
        "id": "Ix5YIzzzrXyZ"
      },
      "outputs": [],
      "source": [
        "#构建私有数据集，就需要用如下方式\n",
        "from torch.utils.data import Dataset\n",
        "\n",
        "class HousingDataset(Dataset):\n",
        "    def __init__(self, mode='train'):\n",
        "        self.x, self.y = dataset_maps[mode] #x,y都是ndarray类型\n",
        "        self.x = torch.from_numpy(scaler.transform(self.x)).float() #from_numpy将NumPy数组转换成PyTorch张量\n",
        "        self.y = torch.from_numpy(self.y).float().reshape(-1, 1) #处理为多行1列的tensor类型\n",
        "\n",
        "    def __len__(self): #必须写\n",
        "        return len(self.x) #返回数据集的长度,0维的size\n",
        "\n",
        "    def __getitem__(self, idx): #idx是索引，返回的是数据和标签，这里是一个样本\n",
        "        return self.x[idx], self.y[idx]\n",
        "\n",
        "#train_ds是dataset类型的数据，与前面例子的FashionMNIST类型一致\n",
        "train_ds = HousingDataset(\"train\")\n",
        "valid_ds = HousingDataset(\"valid\")\n",
        "test_ds = HousingDataset(\"test\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:29:15.953307900Z",
          "start_time": "2024-07-18T03:29:15.945585400Z"
        },
        "id": "5ULPezPsrXyZ",
        "outputId": "5f37b10c-79b4-4ea1-8a9a-04df1040396c"
      },
      "outputs": [
        {
          "data": {
            "text/plain": "(tensor([ 0.8015,  0.2722, -0.1162, -0.2023, -0.5431, -0.0210, -0.5898, -0.0824]),\n tensor([3.2260]))"
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "train_ds[0]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "outputs": [
        {
          "data": {
            "text/plain": "torch.Size([8])"
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "train_ds[0][0]"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:29:48.932161500Z",
          "start_time": "2024-07-18T03:29:48.925274400Z"
        },
        "id": "hPrera9KrXyZ",
        "outputId": "a8fb2068-f008-43b9-c397-59e9f353a5b3"
      }
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vpCbYCIrrXya"
      },
      "source": [
        "### DataLoader"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:30:18.978489900Z",
          "start_time": "2024-07-18T03:30:18.968425200Z"
        },
        "id": "wEZPu5rLrXya"
      },
      "outputs": [],
      "source": [
        "from torch.utils.data import DataLoader\n",
        "\n",
        "#放到DataLoader中的train_ds, valid_ds, test_ds都是dataset类型的数据\n",
        "batch_size = 16\n",
        "train_loader = DataLoader(train_ds, batch_size=batch_size, shuffle=True)\n",
        "val_loader = DataLoader(valid_ds, batch_size=batch_size, shuffle=False)\n",
        "test_loader = DataLoader(test_ds, batch_size=batch_size, shuffle=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1V5fENdmrXya"
      },
      "source": [
        "## 定义模型"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:35:19.886022500Z",
          "start_time": "2024-07-18T03:35:19.882013400Z"
        },
        "id": "tDrwTdZ6rXya"
      },
      "outputs": [],
      "source": [
        "#回归模型我们只需要1个数\n",
        "\n",
        "class NeuralNetwork(nn.Module):\n",
        "    def __init__(self, input_dim=8):\n",
        "        super().__init__()\n",
        "        self.linear_relu_stack = nn.Sequential(\n",
        "            nn.Linear(input_dim, 30),\n",
        "            nn.ReLU(),\n",
        "            nn.Linear(30, 1)\n",
        "            )\n",
        "\n",
        "    def forward(self, x):\n",
        "        # x.shape [batch size, 8]\n",
        "        logits = self.linear_relu_stack(x)\n",
        "        # logits.shape [batch size, 1]\n",
        "        return logits"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:35:23.265092800Z",
          "start_time": "2024-07-18T03:35:23.238971400Z"
        },
        "id": "QZjBpo8IrXya"
      },
      "outputs": [],
      "source": [
        "class EarlyStopCallback:\n",
        "    def __init__(self, patience=5, min_delta=0.01):\n",
        "        \"\"\"\n",
        "\n",
        "        Args:\n",
        "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
        "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute\n",
        "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
        "        \"\"\"\n",
        "        self.patience = patience\n",
        "        self.min_delta = min_delta\n",
        "        self.best_metric = -1\n",
        "        self.counter = 0\n",
        "\n",
        "    def __call__(self, metric):\n",
        "        if metric >= self.best_metric + self.min_delta:\n",
        "            # update best metric\n",
        "            self.best_metric = metric\n",
        "            # reset counter\n",
        "            self.counter = 0\n",
        "        else:\n",
        "            self.counter += 1\n",
        "\n",
        "    @property\n",
        "    def early_stop(self):\n",
        "        return self.counter >= self.patience\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:35:36.376447200Z",
          "start_time": "2024-07-18T03:35:36.353553600Z"
        },
        "id": "iXb_ZwMLrXya"
      },
      "outputs": [],
      "source": [
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "@torch.no_grad()\n",
        "def evaluating(model, dataloader, loss_fct):\n",
        "    loss_list = []\n",
        "    for datas, labels in dataloader:\n",
        "        datas = datas.to(device)\n",
        "        labels = labels.to(device)\n",
        "        # 前向计算\n",
        "        logits = model(datas)\n",
        "        loss = loss_fct(logits, labels)         # 验证集损失\n",
        "        loss_list.append(loss.item())\n",
        "\n",
        "    return np.mean(loss_list)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:40:09.485531200Z",
          "start_time": "2024-07-18T03:38:00.276086800Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 66,
          "referenced_widgets": [
            "97f3b6361ad94750914302b96c8d5734",
            "297e93d2aee24205be4516278ed097e4",
            "f1c5a8b822094702ad691b29c411de18",
            "feabee3ef3aa4d52be49b18262aaabfb",
            "8d906e7188fc495fb041a55db73b33aa",
            "9480724ea65c47388f313f66c716d9d1",
            "367b45ae77f24737bdbbd870c1f1582a",
            "9e6f5c8d83654cc4ad5525ba2919df80",
            "757f498293d846279e2dccaa780dbe89",
            "7ee5c0305cb64bbeaa09e4aa03c680a3",
            "be30ed89380f4e12a73dfc18548a3327"
          ]
        },
        "id": "pi9n8I1ArXya",
        "outputId": "c5ab3f7a-3409-4d77-b989-d2f78748c9e7"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "  0%|          | 0/72600 [00:00<?, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "97f3b6361ad94750914302b96c8d5734"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Early stop at epoch 73 / global_step 52998\n"
          ]
        }
      ],
      "source": [
        "# 训练\n",
        "def training(\n",
        "    model,\n",
        "    train_loader,\n",
        "    val_loader,\n",
        "    epoch,\n",
        "    loss_fct,\n",
        "    optimizer,\n",
        "    early_stop_callback=None,\n",
        "    eval_step=500,\n",
        "    ):\n",
        "    record_dict = {\n",
        "        \"train\": [],\n",
        "        \"val\": []\n",
        "    }\n",
        "\n",
        "    global_step = 0\n",
        "    model.train()\n",
        "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
        "        for epoch_id in range(epoch):\n",
        "            # training\n",
        "            for datas, labels in train_loader:#11610/16=725\n",
        "                datas = datas.to(device)\n",
        "                labels = labels.to(device)\n",
        "                # 梯度清空\n",
        "                optimizer.zero_grad()\n",
        "                # 模型前向计算\n",
        "                logits = model(datas) #得到预测值\n",
        "                # 计算损失\n",
        "                loss = loss_fct(logits, labels)\n",
        "                # 梯度回传\n",
        "                loss.backward()\n",
        "                # 调整优化器，包括学习率的变动等\n",
        "                optimizer.step()\n",
        "\n",
        "                loss = loss.cpu().item() #转为cpu类型，item()是取值\n",
        "                # record\n",
        "\n",
        "                record_dict[\"train\"].append({\n",
        "                    \"loss\": loss, \"step\": global_step\n",
        "                })\n",
        "\n",
        "                # evaluating\n",
        "                if global_step % eval_step == 0:\n",
        "                    model.eval()\n",
        "                    val_loss = evaluating(model, val_loader, loss_fct)\n",
        "                    record_dict[\"val\"].append({\n",
        "                        \"loss\": val_loss, \"step\": global_step\n",
        "                    })\n",
        "                    model.train()\n",
        "\n",
        "                    # 早停 Early Stop\n",
        "                    if early_stop_callback is not None:\n",
        "                        early_stop_callback(-val_loss) #根据验证集的损失来实现早停\n",
        "                        if early_stop_callback.early_stop:\n",
        "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
        "                            return record_dict\n",
        "\n",
        "                # udate step\n",
        "                global_step += 1\n",
        "                pbar.update(1)\n",
        "                pbar.set_postfix({\"epoch\": epoch_id})\n",
        "\n",
        "    return record_dict\n",
        "\n",
        "\n",
        "epoch = 100\n",
        "\n",
        "model = NeuralNetwork()\n",
        "\n",
        "# 1. 定义损失函数 采用MSE损失,均方误差\n",
        "loss_fct = nn.MSELoss()\n",
        "# 2. 定义优化器 采用SGD\n",
        "# Optimizers specified in the torch.optim package\n",
        "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n",
        "\n",
        "# 3. early stop\n",
        "early_stop_callback = EarlyStopCallback(patience=10, min_delta=1e-3)\n",
        "\n",
        "model = model.to(device)\n",
        "record = training(\n",
        "    model,\n",
        "    train_loader,\n",
        "    val_loader,\n",
        "    epoch,\n",
        "    loss_fct,\n",
        "    optimizer,\n",
        "    early_stop_callback=early_stop_callback,\n",
        "    eval_step=len(train_loader)\n",
        "    )"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "{'train': [{'loss': 4.541891098022461, 'step': 0},\n",
              "  {'loss': 4.228561878204346, 'step': 1},\n",
              "  {'loss': 5.489201545715332, 'step': 2},\n",
              "  {'loss': 2.955040693283081, 'step': 3},\n",
              "  {'loss': 5.740527629852295, 'step': 4},\n",
              "  {'loss': 7.4272918701171875, 'step': 5},\n",
              "  {'loss': 6.291813373565674, 'step': 6},\n",
              "  {'loss': 3.8160481452941895, 'step': 7},\n",
              "  {'loss': 3.9973227977752686, 'step': 8},\n",
              "  {'loss': 2.479917049407959, 'step': 9},\n",
              "  {'loss': 4.519018650054932, 'step': 10},\n",
              "  {'loss': 5.267435073852539, 'step': 11},\n",
              "  {'loss': 0.9164307117462158, 'step': 12},\n",
              "  {'loss': 3.0896201133728027, 'step': 13},\n",
              "  {'loss': 0.707262396812439, 'step': 14},\n",
              "  {'loss': 2.965867042541504, 'step': 15},\n",
              "  {'loss': 2.418724536895752, 'step': 16},\n",
              "  {'loss': 3.211021661758423, 'step': 17},\n",
              "  {'loss': 1.737330675125122, 'step': 18},\n",
              "  {'loss': 2.9427478313446045, 'step': 19},\n",
              "  {'loss': 2.820420265197754, 'step': 20},\n",
              "  {'loss': 3.3814477920532227, 'step': 21},\n",
              "  {'loss': 1.5176466703414917, 'step': 22},\n",
              "  {'loss': 2.8804702758789062, 'step': 23},\n",
              "  {'loss': 0.48665714263916016, 'step': 24},\n",
              "  {'loss': 2.0565435886383057, 'step': 25},\n",
              "  {'loss': 1.0099921226501465, 'step': 26},\n",
              "  {'loss': 1.810615062713623, 'step': 27},\n",
              "  {'loss': 2.469241142272949, 'step': 28},\n",
              "  {'loss': 1.9084970951080322, 'step': 29},\n",
              "  {'loss': 1.4736254215240479, 'step': 30},\n",
              "  {'loss': 0.7693604230880737, 'step': 31},\n",
              "  {'loss': 1.9096157550811768, 'step': 32},\n",
              "  {'loss': 1.687330961227417, 'step': 33},\n",
              "  {'loss': 0.5264276266098022, 'step': 34},\n",
              "  {'loss': 0.8495516777038574, 'step': 35},\n",
              "  {'loss': 1.1270344257354736, 'step': 36},\n",
              "  {'loss': 2.1092045307159424, 'step': 37},\n",
              "  {'loss': 1.6375346183776855, 'step': 38},\n",
              "  {'loss': 0.9504552483558655, 'step': 39},\n",
              "  {'loss': 6.62047815322876, 'step': 40},\n",
              "  {'loss': 1.631159782409668, 'step': 41},\n",
              "  {'loss': 0.9476207494735718, 'step': 42},\n",
              "  {'loss': 0.914253830909729, 'step': 43},\n",
              "  {'loss': 0.7091269493103027, 'step': 44},\n",
              "  {'loss': 1.078035593032837, 'step': 45},\n",
              "  {'loss': 1.2240642309188843, 'step': 46},\n",
              "  {'loss': 0.7430287003517151, 'step': 47},\n",
              "  {'loss': 1.6534876823425293, 'step': 48},\n",
              "  {'loss': 1.719672679901123, 'step': 49},\n",
              "  {'loss': 0.85690838098526, 'step': 50},\n",
              "  {'loss': 1.205443024635315, 'step': 51},\n",
              "  {'loss': 1.3276633024215698, 'step': 52},\n",
              "  {'loss': 0.35148799419403076, 'step': 53},\n",
              "  {'loss': 0.8817899227142334, 'step': 54},\n",
              "  {'loss': 0.8678559064865112, 'step': 55},\n",
              "  {'loss': 0.6844379305839539, 'step': 56},\n",
              "  {'loss': 1.1850957870483398, 'step': 57},\n",
              "  {'loss': 0.7268515825271606, 'step': 58},\n",
              "  {'loss': 0.5517680644989014, 'step': 59},\n",
              "  {'loss': 0.7566919326782227, 'step': 60},\n",
              "  {'loss': 0.4351827800273895, 'step': 61},\n",
              "  {'loss': 0.8425852656364441, 'step': 62},\n",
              "  {'loss': 0.6843029856681824, 'step': 63},\n",
              "  {'loss': 1.4117876291275024, 'step': 64},\n",
              "  {'loss': 0.5803300142288208, 'step': 65},\n",
              "  {'loss': 0.38931500911712646, 'step': 66},\n",
              "  {'loss': 0.8628578186035156, 'step': 67},\n",
              "  {'loss': 0.7401374578475952, 'step': 68},\n",
              "  {'loss': 0.2905356287956238, 'step': 69},\n",
              "  {'loss': 0.41943663358688354, 'step': 70},\n",
              "  {'loss': 1.0807362794876099, 'step': 71},\n",
              "  {'loss': 0.8455864787101746, 'step': 72},\n",
              "  {'loss': 1.2659657001495361, 'step': 73},\n",
              "  {'loss': 0.3196181654930115, 'step': 74},\n",
              "  {'loss': 0.6382972598075867, 'step': 75},\n",
              "  {'loss': 0.7654339075088501, 'step': 76},\n",
              "  {'loss': 1.6634185314178467, 'step': 77},\n",
              "  {'loss': 0.9472436308860779, 'step': 78},\n",
              "  {'loss': 0.3739272356033325, 'step': 79},\n",
              "  {'loss': 1.2262165546417236, 'step': 80},\n",
              "  {'loss': 0.6951632499694824, 'step': 81},\n",
              "  {'loss': 0.9014831781387329, 'step': 82},\n",
              "  {'loss': 0.3976404070854187, 'step': 83},\n",
              "  {'loss': 0.8837023973464966, 'step': 84},\n",
              "  {'loss': 0.5552463531494141, 'step': 85},\n",
              "  {'loss': 0.4134492874145508, 'step': 86},\n",
              "  {'loss': 0.35308533906936646, 'step': 87},\n",
              "  {'loss': 0.9328848719596863, 'step': 88},\n",
              "  {'loss': 0.9058465957641602, 'step': 89},\n",
              "  {'loss': 0.40030577778816223, 'step': 90},\n",
              "  {'loss': 0.34589874744415283, 'step': 91},\n",
              "  {'loss': 0.7997187376022339, 'step': 92},\n",
              "  {'loss': 0.7034158110618591, 'step': 93},\n",
              "  {'loss': 0.37735456228256226, 'step': 94},\n",
              "  {'loss': 0.9256772994995117, 'step': 95},\n",
              "  {'loss': 0.5095052719116211, 'step': 96},\n",
              "  {'loss': 0.7104816436767578, 'step': 97},\n",
              "  {'loss': 0.7898767590522766, 'step': 98},\n",
              "  {'loss': 1.1046216487884521, 'step': 99},\n",
              "  {'loss': 0.41824227571487427, 'step': 100},\n",
              "  {'loss': 0.401161789894104, 'step': 101},\n",
              "  {'loss': 0.41792434453964233, 'step': 102},\n",
              "  {'loss': 0.5756655931472778, 'step': 103},\n",
              "  {'loss': 1.102137565612793, 'step': 104},\n",
              "  {'loss': 0.3901219964027405, 'step': 105},\n",
              "  {'loss': 0.20193924009799957, 'step': 106},\n",
              "  {'loss': 0.380489706993103, 'step': 107},\n",
              "  {'loss': 0.4437732696533203, 'step': 108},\n",
              "  {'loss': 0.4183422327041626, 'step': 109},\n",
              "  {'loss': 0.5223734974861145, 'step': 110},\n",
              "  {'loss': 0.5177714824676514, 'step': 111},\n",
              "  {'loss': 0.9615244269371033, 'step': 112},\n",
              "  {'loss': 1.4253959655761719, 'step': 113},\n",
              "  {'loss': 0.43195879459381104, 'step': 114},\n",
              "  {'loss': 0.6173931360244751, 'step': 115},\n",
              "  {'loss': 0.3264087736606598, 'step': 116},\n",
              "  {'loss': 0.257138192653656, 'step': 117},\n",
              "  {'loss': 0.35226863622665405, 'step': 118},\n",
              "  {'loss': 0.448138564825058, 'step': 119},\n",
              "  {'loss': 1.0503058433532715, 'step': 120},\n",
              "  {'loss': 0.3958410918712616, 'step': 121},\n",
              "  {'loss': 0.3264109492301941, 'step': 122},\n",
              "  {'loss': 0.40683847665786743, 'step': 123},\n",
              "  {'loss': 0.7042597532272339, 'step': 124},\n",
              "  {'loss': 1.1547704935073853, 'step': 125},\n",
              "  {'loss': 0.7396473288536072, 'step': 126},\n",
              "  {'loss': 1.460465431213379, 'step': 127},\n",
              "  {'loss': 0.5523372888565063, 'step': 128},\n",
              "  {'loss': 0.6092003583908081, 'step': 129},\n",
              "  {'loss': 0.6117590665817261, 'step': 130},\n",
              "  {'loss': 1.6657214164733887, 'step': 131},\n",
              "  {'loss': 0.6062957048416138, 'step': 132},\n",
              "  {'loss': 0.5165196657180786, 'step': 133},\n",
              "  {'loss': 0.49079862236976624, 'step': 134},\n",
              "  {'loss': 0.7383797764778137, 'step': 135},\n",
              "  {'loss': 0.25430944561958313, 'step': 136},\n",
              "  {'loss': 0.6271547675132751, 'step': 137},\n",
              "  {'loss': 0.5813647508621216, 'step': 138},\n",
              "  {'loss': 0.46287801861763, 'step': 139},\n",
              "  {'loss': 0.46627384424209595, 'step': 140},\n",
              "  {'loss': 0.6622115969657898, 'step': 141},\n",
              "  {'loss': 0.8061724901199341, 'step': 142},\n",
              "  {'loss': 0.48848921060562134, 'step': 143},\n",
              "  {'loss': 0.5454250574111938, 'step': 144},\n",
              "  {'loss': 0.5469745397567749, 'step': 145},\n",
              "  {'loss': 0.5036360025405884, 'step': 146},\n",
              "  {'loss': 0.23493969440460205, 'step': 147},\n",
              "  {'loss': 0.4739711582660675, 'step': 148},\n",
              "  {'loss': 0.6819835305213928, 'step': 149},\n",
              "  {'loss': 0.7232041358947754, 'step': 150},\n",
              "  {'loss': 0.7646574974060059, 'step': 151},\n",
              "  {'loss': 0.21829119324684143, 'step': 152},\n",
              "  {'loss': 1.845590353012085, 'step': 153},\n",
              "  {'loss': 0.9857789278030396, 'step': 154},\n",
              "  {'loss': 1.1375188827514648, 'step': 155},\n",
              "  {'loss': 0.5172932147979736, 'step': 156},\n",
              "  {'loss': 0.3793568015098572, 'step': 157},\n",
              "  {'loss': 0.5187150835990906, 'step': 158},\n",
              "  {'loss': 0.17441309988498688, 'step': 159},\n",
              "  {'loss': 0.4936109781265259, 'step': 160},\n",
              "  {'loss': 0.6699538230895996, 'step': 161},\n",
              "  {'loss': 0.6375038623809814, 'step': 162},\n",
              "  {'loss': 0.37685084342956543, 'step': 163},\n",
              "  {'loss': 0.6157287359237671, 'step': 164},\n",
              "  {'loss': 0.9491423964500427, 'step': 165},\n",
              "  {'loss': 0.22865049540996552, 'step': 166},\n",
              "  {'loss': 0.9149855375289917, 'step': 167},\n",
              "  {'loss': 0.8618932366371155, 'step': 168},\n",
              "  {'loss': 0.457793653011322, 'step': 169},\n",
              "  {'loss': 0.3488210439682007, 'step': 170},\n",
              "  {'loss': 0.7422409653663635, 'step': 171},\n",
              "  {'loss': 0.28408151865005493, 'step': 172},\n",
              "  {'loss': 0.6825629472732544, 'step': 173},\n",
              "  {'loss': 0.858661949634552, 'step': 174},\n",
              "  {'loss': 0.38378480076789856, 'step': 175},\n",
              "  {'loss': 0.5256237387657166, 'step': 176},\n",
              "  {'loss': 1.1140458583831787, 'step': 177},\n",
              "  {'loss': 0.6415117383003235, 'step': 178},\n",
              "  {'loss': 0.47989988327026367, 'step': 179},\n",
              "  {'loss': 0.5528837442398071, 'step': 180},\n",
              "  {'loss': 0.7108170986175537, 'step': 181},\n",
              "  {'loss': 0.6624122858047485, 'step': 182},\n",
              "  {'loss': 0.43852055072784424, 'step': 183},\n",
              "  {'loss': 0.8234999179840088, 'step': 184},\n",
              "  {'loss': 0.8928591012954712, 'step': 185},\n",
              "  {'loss': 0.2962302565574646, 'step': 186},\n",
              "  {'loss': 0.5326279997825623, 'step': 187},\n",
              "  {'loss': 0.7778052687644958, 'step': 188},\n",
              "  {'loss': 0.08344441652297974, 'step': 189},\n",
              "  {'loss': 0.5383751392364502, 'step': 190},\n",
              "  {'loss': 0.4430224299430847, 'step': 191},\n",
              "  {'loss': 0.4948655962944031, 'step': 192},\n",
              "  {'loss': 0.3300803005695343, 'step': 193},\n",
              "  {'loss': 0.4385930895805359, 'step': 194},\n",
              "  {'loss': 0.13940373063087463, 'step': 195},\n",
              "  {'loss': 0.22775164246559143, 'step': 196},\n",
              "  {'loss': 0.7883190512657166, 'step': 197},\n",
              "  {'loss': 0.707548975944519, 'step': 198},\n",
              "  {'loss': 1.0273716449737549, 'step': 199},\n",
              "  {'loss': 0.3865315020084381, 'step': 200},\n",
              "  {'loss': 0.27656033635139465, 'step': 201},\n",
              "  {'loss': 0.5287860631942749, 'step': 202},\n",
              "  {'loss': 1.1881303787231445, 'step': 203},\n",
              "  {'loss': 0.34381401538848877, 'step': 204},\n",
              "  {'loss': 0.47446170449256897, 'step': 205},\n",
              "  {'loss': 0.5788822174072266, 'step': 206},\n",
              "  {'loss': 0.28949061036109924, 'step': 207},\n",
              "  {'loss': 0.6737508773803711, 'step': 208},\n",
              "  {'loss': 0.5456247329711914, 'step': 209},\n",
              "  {'loss': 0.4157556891441345, 'step': 210},\n",
              "  {'loss': 0.603794276714325, 'step': 211},\n",
              "  {'loss': 0.46574538946151733, 'step': 212},\n",
              "  {'loss': 1.2103571891784668, 'step': 213},\n",
              "  {'loss': 0.18110299110412598, 'step': 214},\n",
              "  {'loss': 0.22952070832252502, 'step': 215},\n",
              "  {'loss': 0.38435739278793335, 'step': 216},\n",
              "  {'loss': 0.9006848931312561, 'step': 217},\n",
              "  {'loss': 0.5138681530952454, 'step': 218},\n",
              "  {'loss': 0.9215801954269409, 'step': 219},\n",
              "  {'loss': 0.7359023094177246, 'step': 220},\n",
              "  {'loss': 0.4221057593822479, 'step': 221},\n",
              "  {'loss': 0.8422679901123047, 'step': 222},\n",
              "  {'loss': 0.406349778175354, 'step': 223},\n",
              "  {'loss': 0.3614986538887024, 'step': 224},\n",
              "  {'loss': 0.35663512349128723, 'step': 225},\n",
              "  {'loss': 0.3234543204307556, 'step': 226},\n",
              "  {'loss': 0.34923630952835083, 'step': 227},\n",
              "  {'loss': 1.5853849649429321, 'step': 228},\n",
              "  {'loss': 0.6466920375823975, 'step': 229},\n",
              "  {'loss': 0.4115658402442932, 'step': 230},\n",
              "  {'loss': 0.24187709391117096, 'step': 231},\n",
              "  {'loss': 0.2826313376426697, 'step': 232},\n",
              "  {'loss': 0.5516945719718933, 'step': 233},\n",
              "  {'loss': 1.3862186670303345, 'step': 234},\n",
              "  {'loss': 0.47495073080062866, 'step': 235},\n",
              "  {'loss': 0.453503280878067, 'step': 236},\n",
              "  {'loss': 0.3577614426612854, 'step': 237},\n",
              "  {'loss': 0.2446538209915161, 'step': 238},\n",
              "  {'loss': 0.6461694836616516, 'step': 239},\n",
              "  {'loss': 1.3213236331939697, 'step': 240},\n",
              "  {'loss': 0.5806307792663574, 'step': 241},\n",
              "  {'loss': 0.6367830634117126, 'step': 242},\n",
              "  {'loss': 0.44541338086128235, 'step': 243},\n",
              "  {'loss': 0.8166453838348389, 'step': 244},\n",
              "  {'loss': 1.0804426670074463, 'step': 245},\n",
              "  {'loss': 1.9472863674163818, 'step': 246},\n",
              "  {'loss': 0.9195682406425476, 'step': 247},\n",
              "  {'loss': 0.14650800824165344, 'step': 248},\n",
              "  {'loss': 0.2280764877796173, 'step': 249},\n",
              "  {'loss': 0.5448017120361328, 'step': 250},\n",
              "  {'loss': 0.5661729574203491, 'step': 251},\n",
              "  {'loss': 1.2288274765014648, 'step': 252},\n",
              "  {'loss': 0.5407872200012207, 'step': 253},\n",
              "  {'loss': 0.21826106309890747, 'step': 254},\n",
              "  {'loss': 0.5023396015167236, 'step': 255},\n",
              "  {'loss': 0.27820318937301636, 'step': 256},\n",
              "  {'loss': 0.9253647327423096, 'step': 257},\n",
              "  {'loss': 0.6496186256408691, 'step': 258},\n",
              "  {'loss': 0.26773253083229065, 'step': 259},\n",
              "  {'loss': 0.5145654678344727, 'step': 260},\n",
              "  {'loss': 0.2876286506652832, 'step': 261},\n",
              "  {'loss': 0.8129434585571289, 'step': 262},\n",
              "  {'loss': 0.7717599868774414, 'step': 263},\n",
              "  {'loss': 0.6965052485466003, 'step': 264},\n",
              "  {'loss': 0.3095577359199524, 'step': 265},\n",
              "  {'loss': 0.43462201952934265, 'step': 266},\n",
              "  {'loss': 0.2796894609928131, 'step': 267},\n",
              "  {'loss': 0.5544742345809937, 'step': 268},\n",
              "  {'loss': 0.2367190718650818, 'step': 269},\n",
              "  {'loss': 0.7269469499588013, 'step': 270},\n",
              "  {'loss': 0.7241145968437195, 'step': 271},\n",
              "  {'loss': 0.3349282443523407, 'step': 272},\n",
              "  {'loss': 0.7454596161842346, 'step': 273},\n",
              "  {'loss': 1.7234928607940674, 'step': 274},\n",
              "  {'loss': 0.4596463739871979, 'step': 275},\n",
              "  {'loss': 0.2846616506576538, 'step': 276},\n",
              "  {'loss': 0.2341870665550232, 'step': 277},\n",
              "  {'loss': 0.5550652742385864, 'step': 278},\n",
              "  {'loss': 1.2451119422912598, 'step': 279},\n",
              "  {'loss': 0.7368722558021545, 'step': 280},\n",
              "  {'loss': 0.12324361503124237, 'step': 281},\n",
              "  {'loss': 0.23747065663337708, 'step': 282},\n",
              "  {'loss': 0.29448211193084717, 'step': 283},\n",
              "  {'loss': 0.21680593490600586, 'step': 284},\n",
              "  {'loss': 0.29095178842544556, 'step': 285},\n",
              "  {'loss': 0.707286536693573, 'step': 286},\n",
              "  {'loss': 0.46133559942245483, 'step': 287},\n",
              "  {'loss': 0.4646614193916321, 'step': 288},\n",
              "  {'loss': 1.0061070919036865, 'step': 289},\n",
              "  {'loss': 0.21087151765823364, 'step': 290},\n",
              "  {'loss': 0.7880361080169678, 'step': 291},\n",
              "  {'loss': 0.6101113557815552, 'step': 292},\n",
              "  {'loss': 0.5138574838638306, 'step': 293},\n",
              "  {'loss': 0.6554688215255737, 'step': 294},\n",
              "  {'loss': 0.3984273076057434, 'step': 295},\n",
              "  {'loss': 0.6124587655067444, 'step': 296},\n",
              "  {'loss': 0.8422218561172485, 'step': 297},\n",
              "  {'loss': 0.20201972126960754, 'step': 298},\n",
              "  {'loss': 0.9338491559028625, 'step': 299},\n",
              "  {'loss': 0.9844394326210022, 'step': 300},\n",
              "  {'loss': 0.5658591985702515, 'step': 301},\n",
              "  {'loss': 0.5495614409446716, 'step': 302},\n",
              "  {'loss': 0.8604089021682739, 'step': 303},\n",
              "  {'loss': 0.6945290565490723, 'step': 304},\n",
              "  {'loss': 0.2219030261039734, 'step': 305},\n",
              "  {'loss': 0.22067566215991974, 'step': 306},\n",
              "  {'loss': 0.2949841022491455, 'step': 307},\n",
              "  {'loss': 0.6119526624679565, 'step': 308},\n",
              "  {'loss': 0.7467964887619019, 'step': 309},\n",
              "  {'loss': 0.6319370865821838, 'step': 310},\n",
              "  {'loss': 0.21692189574241638, 'step': 311},\n",
              "  {'loss': 0.3940291404724121, 'step': 312},\n",
              "  {'loss': 0.7718154191970825, 'step': 313},\n",
              "  {'loss': 0.5387807488441467, 'step': 314},\n",
              "  {'loss': 0.43904584646224976, 'step': 315},\n",
              "  {'loss': 0.35305124521255493, 'step': 316},\n",
              "  {'loss': 0.3969094157218933, 'step': 317},\n",
              "  {'loss': 0.5086742043495178, 'step': 318},\n",
              "  {'loss': 0.24028119444847107, 'step': 319},\n",
              "  {'loss': 0.44122767448425293, 'step': 320},\n",
              "  {'loss': 0.2197386920452118, 'step': 321},\n",
              "  {'loss': 1.527082920074463, 'step': 322},\n",
              "  {'loss': 0.512054979801178, 'step': 323},\n",
              "  {'loss': 1.2082197666168213, 'step': 324},\n",
              "  {'loss': 0.43825167417526245, 'step': 325},\n",
              "  {'loss': 0.2469455897808075, 'step': 326},\n",
              "  {'loss': 0.4226256012916565, 'step': 327},\n",
              "  {'loss': 1.2738666534423828, 'step': 328},\n",
              "  {'loss': 0.49006062746047974, 'step': 329},\n",
              "  {'loss': 0.699326753616333, 'step': 330},\n",
              "  {'loss': 0.2294994294643402, 'step': 331},\n",
              "  {'loss': 0.955166220664978, 'step': 332},\n",
              "  {'loss': 0.36041828989982605, 'step': 333},\n",
              "  {'loss': 0.3987025320529938, 'step': 334},\n",
              "  {'loss': 0.5977627038955688, 'step': 335},\n",
              "  {'loss': 0.9276317358016968, 'step': 336},\n",
              "  {'loss': 0.41754597425460815, 'step': 337},\n",
              "  {'loss': 0.40623000264167786, 'step': 338},\n",
              "  {'loss': 0.33756858110427856, 'step': 339},\n",
              "  {'loss': 0.2606751620769501, 'step': 340},\n",
              "  {'loss': 0.37200701236724854, 'step': 341},\n",
              "  {'loss': 0.36593112349510193, 'step': 342},\n",
              "  {'loss': 0.393374502658844, 'step': 343},\n",
              "  {'loss': 0.3760661780834198, 'step': 344},\n",
              "  {'loss': 0.48321327567100525, 'step': 345},\n",
              "  {'loss': 0.21770305931568146, 'step': 346},\n",
              "  {'loss': 0.4844015836715698, 'step': 347},\n",
              "  {'loss': 0.8779768943786621, 'step': 348},\n",
              "  {'loss': 0.235964834690094, 'step': 349},\n",
              "  {'loss': 0.29809343814849854, 'step': 350},\n",
              "  {'loss': 0.9077914357185364, 'step': 351},\n",
              "  {'loss': 0.3617292642593384, 'step': 352},\n",
              "  {'loss': 0.49038124084472656, 'step': 353},\n",
              "  {'loss': 0.39614325761795044, 'step': 354},\n",
              "  {'loss': 0.8667765259742737, 'step': 355},\n",
              "  {'loss': 0.43519505858421326, 'step': 356},\n",
              "  {'loss': 0.21242550015449524, 'step': 357},\n",
              "  {'loss': 0.5541422367095947, 'step': 358},\n",
              "  {'loss': 0.5231214761734009, 'step': 359},\n",
              "  {'loss': 0.34101253747940063, 'step': 360},\n",
              "  {'loss': 0.3773226737976074, 'step': 361},\n",
              "  {'loss': 0.21154847741127014, 'step': 362},\n",
              "  {'loss': 0.614407479763031, 'step': 363},\n",
              "  {'loss': 0.6795738339424133, 'step': 364},\n",
              "  {'loss': 0.4778023064136505, 'step': 365},\n",
              "  {'loss': 0.9409244656562805, 'step': 366},\n",
              "  {'loss': 0.1154085174202919, 'step': 367},\n",
              "  {'loss': 0.3111967146396637, 'step': 368},\n",
              "  {'loss': 0.6445065140724182, 'step': 369},\n",
              "  {'loss': 0.27308738231658936, 'step': 370},\n",
              "  {'loss': 0.5008239150047302, 'step': 371},\n",
              "  {'loss': 0.40428608655929565, 'step': 372},\n",
              "  {'loss': 0.9880467653274536, 'step': 373},\n",
              "  {'loss': 0.28363749384880066, 'step': 374},\n",
              "  {'loss': 0.30533674359321594, 'step': 375},\n",
              "  {'loss': 0.47239869832992554, 'step': 376},\n",
              "  {'loss': 0.24892807006835938, 'step': 377},\n",
              "  {'loss': 0.5966673493385315, 'step': 378},\n",
              "  {'loss': 0.6494123935699463, 'step': 379},\n",
              "  {'loss': 0.2574695348739624, 'step': 380},\n",
              "  {'loss': 0.44141799211502075, 'step': 381},\n",
              "  {'loss': 0.5486718416213989, 'step': 382},\n",
              "  {'loss': 0.7728052139282227, 'step': 383},\n",
              "  {'loss': 0.26432037353515625, 'step': 384},\n",
              "  {'loss': 0.76827073097229, 'step': 385},\n",
              "  {'loss': 1.3053288459777832, 'step': 386},\n",
              "  {'loss': 0.9213238954544067, 'step': 387},\n",
              "  {'loss': 0.3844755291938782, 'step': 388},\n",
              "  {'loss': 0.630102276802063, 'step': 389},\n",
              "  {'loss': 0.39565545320510864, 'step': 390},\n",
              "  {'loss': 0.20362628996372223, 'step': 391},\n",
              "  {'loss': 1.2762641906738281, 'step': 392},\n",
              "  {'loss': 0.5540281534194946, 'step': 393},\n",
              "  {'loss': 0.26375070214271545, 'step': 394},\n",
              "  {'loss': 0.40732240676879883, 'step': 395},\n",
              "  {'loss': 0.4163508713245392, 'step': 396},\n",
              "  {'loss': 0.46216776967048645, 'step': 397},\n",
              "  {'loss': 0.3124944269657135, 'step': 398},\n",
              "  {'loss': 0.26696449518203735, 'step': 399},\n",
              "  {'loss': 0.2532498240470886, 'step': 400},\n",
              "  {'loss': 0.1545185148715973, 'step': 401},\n",
              "  {'loss': 0.5154995918273926, 'step': 402},\n",
              "  {'loss': 0.8061590194702148, 'step': 403},\n",
              "  {'loss': 0.4367017149925232, 'step': 404},\n",
              "  {'loss': 0.14633312821388245, 'step': 405},\n",
              "  {'loss': 0.27493414282798767, 'step': 406},\n",
              "  {'loss': 0.9103976488113403, 'step': 407},\n",
              "  {'loss': 0.6049638986587524, 'step': 408},\n",
              "  {'loss': 0.34944605827331543, 'step': 409},\n",
              "  {'loss': 0.4620398283004761, 'step': 410},\n",
              "  {'loss': 1.691084623336792, 'step': 411},\n",
              "  {'loss': 0.8503590822219849, 'step': 412},\n",
              "  {'loss': 0.4201945662498474, 'step': 413},\n",
              "  {'loss': 1.4272685050964355, 'step': 414},\n",
              "  {'loss': 1.261830449104309, 'step': 415},\n",
              "  {'loss': 0.3538476526737213, 'step': 416},\n",
              "  {'loss': 0.48038941621780396, 'step': 417},\n",
              "  {'loss': 0.369913250207901, 'step': 418},\n",
              "  {'loss': 0.5274415612220764, 'step': 419},\n",
              "  {'loss': 0.5698000192642212, 'step': 420},\n",
              "  {'loss': 0.3248460590839386, 'step': 421},\n",
              "  {'loss': 0.7191654443740845, 'step': 422},\n",
              "  {'loss': 0.28524771332740784, 'step': 423},\n",
              "  {'loss': 0.5586877465248108, 'step': 424},\n",
              "  {'loss': 0.789973258972168, 'step': 425},\n",
              "  {'loss': 0.5024189352989197, 'step': 426},\n",
              "  {'loss': 0.15494303405284882, 'step': 427},\n",
              "  {'loss': 0.315962553024292, 'step': 428},\n",
              "  {'loss': 0.3218487501144409, 'step': 429},\n",
              "  {'loss': 0.3298518657684326, 'step': 430},\n",
              "  {'loss': 0.38340556621551514, 'step': 431},\n",
              "  {'loss': 0.28443774580955505, 'step': 432},\n",
              "  {'loss': 0.22853100299835205, 'step': 433},\n",
              "  {'loss': 0.20350980758666992, 'step': 434},\n",
              "  {'loss': 0.4539632499217987, 'step': 435},\n",
              "  {'loss': 0.7840099930763245, 'step': 436},\n",
              "  {'loss': 0.6143677830696106, 'step': 437},\n",
              "  {'loss': 0.3189973831176758, 'step': 438},\n",
              "  {'loss': 0.6735167503356934, 'step': 439},\n",
              "  {'loss': 0.32592400908470154, 'step': 440},\n",
              "  {'loss': 0.6813838481903076, 'step': 441},\n",
              "  {'loss': 0.4085964262485504, 'step': 442},\n",
              "  {'loss': 0.3686482012271881, 'step': 443},\n",
              "  {'loss': 1.559309482574463, 'step': 444},\n",
              "  {'loss': 0.4263826012611389, 'step': 445},\n",
              "  {'loss': 0.2275407612323761, 'step': 446},\n",
              "  {'loss': 0.30083829164505005, 'step': 447},\n",
              "  {'loss': 0.4976952075958252, 'step': 448},\n",
              "  {'loss': 0.8075603246688843, 'step': 449},\n",
              "  {'loss': 0.38433122634887695, 'step': 450},\n",
              "  {'loss': 0.3874894976615906, 'step': 451},\n",
              "  {'loss': 0.44463661313056946, 'step': 452},\n",
              "  {'loss': 0.24341394007205963, 'step': 453},\n",
              "  {'loss': 0.5152689218521118, 'step': 454},\n",
              "  {'loss': 0.25310218334198, 'step': 455},\n",
              "  {'loss': 0.6791811585426331, 'step': 456},\n",
              "  {'loss': 1.2618234157562256, 'step': 457},\n",
              "  {'loss': 0.7835949659347534, 'step': 458},\n",
              "  {'loss': 0.3230507969856262, 'step': 459},\n",
              "  {'loss': 0.2873590886592865, 'step': 460},\n",
              "  {'loss': 0.7161555290222168, 'step': 461},\n",
              "  {'loss': 0.3565658926963806, 'step': 462},\n",
              "  {'loss': 0.5906304121017456, 'step': 463},\n",
              "  {'loss': 1.1052350997924805, 'step': 464},\n",
              "  {'loss': 0.32449719309806824, 'step': 465},\n",
              "  {'loss': 0.7262058854103088, 'step': 466},\n",
              "  {'loss': 0.33933115005493164, 'step': 467},\n",
              "  {'loss': 0.1619882583618164, 'step': 468},\n",
              "  {'loss': 0.2686135172843933, 'step': 469},\n",
              "  {'loss': 0.24604518711566925, 'step': 470},\n",
              "  {'loss': 0.5375519394874573, 'step': 471},\n",
              "  {'loss': 0.8675498962402344, 'step': 472},\n",
              "  {'loss': 1.3958258628845215, 'step': 473},\n",
              "  {'loss': 0.5582796335220337, 'step': 474},\n",
              "  {'loss': 0.3454982042312622, 'step': 475},\n",
              "  {'loss': 0.27581459283828735, 'step': 476},\n",
              "  {'loss': 0.4602786600589752, 'step': 477},\n",
              "  {'loss': 0.3484347462654114, 'step': 478},\n",
              "  {'loss': 0.8883363604545593, 'step': 479},\n",
              "  {'loss': 0.2990162968635559, 'step': 480},\n",
              "  {'loss': 0.8912584781646729, 'step': 481},\n",
              "  {'loss': 0.7358434200286865, 'step': 482},\n",
              "  {'loss': 0.3160076439380646, 'step': 483},\n",
              "  {'loss': 1.4184374809265137, 'step': 484},\n",
              "  {'loss': 0.45583850145339966, 'step': 485},\n",
              "  {'loss': 0.975538969039917, 'step': 486},\n",
              "  {'loss': 0.1630348563194275, 'step': 487},\n",
              "  {'loss': 0.7350518703460693, 'step': 488},\n",
              "  {'loss': 0.5093732476234436, 'step': 489},\n",
              "  {'loss': 0.5475127696990967, 'step': 490},\n",
              "  {'loss': 0.8836538195610046, 'step': 491},\n",
              "  {'loss': 0.13506922125816345, 'step': 492},\n",
              "  {'loss': 0.32107311487197876, 'step': 493},\n",
              "  {'loss': 0.38384565711021423, 'step': 494},\n",
              "  {'loss': 0.20039239525794983, 'step': 495},\n",
              "  {'loss': 0.5750836133956909, 'step': 496},\n",
              "  {'loss': 0.4408961534500122, 'step': 497},\n",
              "  {'loss': 0.8754065036773682, 'step': 498},\n",
              "  {'loss': 1.2329297065734863, 'step': 499},\n",
              "  {'loss': 0.7256994247436523, 'step': 500},\n",
              "  {'loss': 0.7849429845809937, 'step': 501},\n",
              "  {'loss': 0.41324737668037415, 'step': 502},\n",
              "  {'loss': 0.4092569649219513, 'step': 503},\n",
              "  {'loss': 0.3283146917819977, 'step': 504},\n",
              "  {'loss': 0.5840829014778137, 'step': 505},\n",
              "  {'loss': 0.7871323227882385, 'step': 506},\n",
              "  {'loss': 0.3131871521472931, 'step': 507},\n",
              "  {'loss': 0.45769673585891724, 'step': 508},\n",
              "  {'loss': 1.2266849279403687, 'step': 509},\n",
              "  {'loss': 0.6724098324775696, 'step': 510},\n",
              "  {'loss': 0.6076302528381348, 'step': 511},\n",
              "  {'loss': 0.3645778298377991, 'step': 512},\n",
              "  {'loss': 0.24433499574661255, 'step': 513},\n",
              "  {'loss': 0.7660832405090332, 'step': 514},\n",
              "  {'loss': 0.43530043959617615, 'step': 515},\n",
              "  {'loss': 0.20296958088874817, 'step': 516},\n",
              "  {'loss': 0.23212189972400665, 'step': 517},\n",
              "  {'loss': 0.3742108643054962, 'step': 518},\n",
              "  {'loss': 0.4070180356502533, 'step': 519},\n",
              "  {'loss': 0.9234989881515503, 'step': 520},\n",
              "  {'loss': 0.8942122459411621, 'step': 521},\n",
              "  {'loss': 0.3826674818992615, 'step': 522},\n",
              "  {'loss': 0.49135708808898926, 'step': 523},\n",
              "  {'loss': 0.44813627004623413, 'step': 524},\n",
              "  {'loss': 0.9521588683128357, 'step': 525},\n",
              "  {'loss': 0.7128821611404419, 'step': 526},\n",
              "  {'loss': 0.21505558490753174, 'step': 527},\n",
              "  {'loss': 0.3066258430480957, 'step': 528},\n",
              "  {'loss': 0.47930631041526794, 'step': 529},\n",
              "  {'loss': 0.17894238233566284, 'step': 530},\n",
              "  {'loss': 0.3222733736038208, 'step': 531},\n",
              "  {'loss': 0.2485065758228302, 'step': 532},\n",
              "  {'loss': 0.3483685851097107, 'step': 533},\n",
              "  {'loss': 0.9820089936256409, 'step': 534},\n",
              "  {'loss': 0.25683844089508057, 'step': 535},\n",
              "  {'loss': 0.5890198945999146, 'step': 536},\n",
              "  {'loss': 0.34390783309936523, 'step': 537},\n",
              "  {'loss': 0.3254508972167969, 'step': 538},\n",
              "  {'loss': 0.5768774747848511, 'step': 539},\n",
              "  {'loss': 0.1553645133972168, 'step': 540},\n",
              "  {'loss': 0.2111598253250122, 'step': 541},\n",
              "  {'loss': 0.5873117446899414, 'step': 542},\n",
              "  {'loss': 0.16453832387924194, 'step': 543},\n",
              "  {'loss': 0.19665497541427612, 'step': 544},\n",
              "  {'loss': 0.18807245790958405, 'step': 545},\n",
              "  {'loss': 0.515751838684082, 'step': 546},\n",
              "  {'loss': 0.1871323585510254, 'step': 547},\n",
              "  {'loss': 0.8470771312713623, 'step': 548},\n",
              "  {'loss': 0.16402095556259155, 'step': 549},\n",
              "  {'loss': 0.37974223494529724, 'step': 550},\n",
              "  {'loss': 0.34899669885635376, 'step': 551},\n",
              "  {'loss': 0.452494740486145, 'step': 552},\n",
              "  {'loss': 0.544474720954895, 'step': 553},\n",
              "  {'loss': 0.2988031804561615, 'step': 554},\n",
              "  {'loss': 0.35255467891693115, 'step': 555},\n",
              "  {'loss': 0.37678712606430054, 'step': 556},\n",
              "  {'loss': 0.25957027077674866, 'step': 557},\n",
              "  {'loss': 1.0663888454437256, 'step': 558},\n",
              "  {'loss': 0.37950825691223145, 'step': 559},\n",
              "  {'loss': 0.426429808139801, 'step': 560},\n",
              "  {'loss': 0.30784618854522705, 'step': 561},\n",
              "  {'loss': 0.782889187335968, 'step': 562},\n",
              "  {'loss': 0.7725536227226257, 'step': 563},\n",
              "  {'loss': 0.9029295444488525, 'step': 564},\n",
              "  {'loss': 0.9700062274932861, 'step': 565},\n",
              "  {'loss': 0.5114850401878357, 'step': 566},\n",
              "  {'loss': 0.25178655982017517, 'step': 567},\n",
              "  {'loss': 0.5463185906410217, 'step': 568},\n",
              "  {'loss': 1.072216272354126, 'step': 569},\n",
              "  {'loss': 0.18972918391227722, 'step': 570},\n",
              "  {'loss': 0.1426835060119629, 'step': 571},\n",
              "  {'loss': 0.6736497282981873, 'step': 572},\n",
              "  {'loss': 0.7390159368515015, 'step': 573},\n",
              "  {'loss': 0.3243243098258972, 'step': 574},\n",
              "  {'loss': 0.6401474475860596, 'step': 575},\n",
              "  {'loss': 0.4376406669616699, 'step': 576},\n",
              "  {'loss': 0.5528788566589355, 'step': 577},\n",
              "  {'loss': 0.500053346157074, 'step': 578},\n",
              "  {'loss': 0.23868726193904877, 'step': 579},\n",
              "  {'loss': 0.42123180627822876, 'step': 580},\n",
              "  {'loss': 0.2213270366191864, 'step': 581},\n",
              "  {'loss': 1.0003679990768433, 'step': 582},\n",
              "  {'loss': 0.2796587646007538, 'step': 583},\n",
              "  {'loss': 0.44211405515670776, 'step': 584},\n",
              "  {'loss': 0.23940488696098328, 'step': 585},\n",
              "  {'loss': 0.5744187831878662, 'step': 586},\n",
              "  {'loss': 0.5183162689208984, 'step': 587},\n",
              "  {'loss': 0.4832029342651367, 'step': 588},\n",
              "  {'loss': 0.4512939453125, 'step': 589},\n",
              "  {'loss': 0.9644063115119934, 'step': 590},\n",
              "  {'loss': 0.30261439085006714, 'step': 591},\n",
              "  {'loss': 0.5677840113639832, 'step': 592},\n",
              "  {'loss': 0.15078851580619812, 'step': 593},\n",
              "  {'loss': 0.9172506928443909, 'step': 594},\n",
              "  {'loss': 1.047271728515625, 'step': 595},\n",
              "  {'loss': 0.23672297596931458, 'step': 596},\n",
              "  {'loss': 0.20777752995491028, 'step': 597},\n",
              "  {'loss': 0.48175373673439026, 'step': 598},\n",
              "  {'loss': 0.3729288876056671, 'step': 599},\n",
              "  {'loss': 0.3284969925880432, 'step': 600},\n",
              "  {'loss': 0.43342918157577515, 'step': 601},\n",
              "  {'loss': 0.5334581136703491, 'step': 602},\n",
              "  {'loss': 0.5111084580421448, 'step': 603},\n",
              "  {'loss': 0.23935306072235107, 'step': 604},\n",
              "  {'loss': 0.25150102376937866, 'step': 605},\n",
              "  {'loss': 0.21345403790473938, 'step': 606},\n",
              "  {'loss': 0.8358156681060791, 'step': 607},\n",
              "  {'loss': 0.19886718690395355, 'step': 608},\n",
              "  {'loss': 0.45091694593429565, 'step': 609},\n",
              "  {'loss': 1.3801780939102173, 'step': 610},\n",
              "  {'loss': 0.17828208208084106, 'step': 611},\n",
              "  {'loss': 0.21003620326519012, 'step': 612},\n",
              "  {'loss': 0.26267993450164795, 'step': 613},\n",
              "  {'loss': 0.3143092095851898, 'step': 614},\n",
              "  {'loss': 0.11523129045963287, 'step': 615},\n",
              "  {'loss': 0.49590036273002625, 'step': 616},\n",
              "  {'loss': 0.4666856527328491, 'step': 617},\n",
              "  {'loss': 0.881277322769165, 'step': 618},\n",
              "  {'loss': 0.21574947237968445, 'step': 619},\n",
              "  {'loss': 0.45750460028648376, 'step': 620},\n",
              "  {'loss': 0.25191524624824524, 'step': 621},\n",
              "  {'loss': 0.3885372281074524, 'step': 622},\n",
              "  {'loss': 0.39462044835090637, 'step': 623},\n",
              "  {'loss': 0.3463495671749115, 'step': 624},\n",
              "  {'loss': 0.15528975427150726, 'step': 625},\n",
              "  {'loss': 0.7558867931365967, 'step': 626},\n",
              "  {'loss': 0.2096042037010193, 'step': 627},\n",
              "  {'loss': 0.8178473711013794, 'step': 628},\n",
              "  {'loss': 0.15411314368247986, 'step': 629},\n",
              "  {'loss': 0.34742817282676697, 'step': 630},\n",
              "  {'loss': 0.2880924940109253, 'step': 631},\n",
              "  {'loss': 0.2499362975358963, 'step': 632},\n",
              "  {'loss': 0.7864729762077332, 'step': 633},\n",
              "  {'loss': 1.3370518684387207, 'step': 634},\n",
              "  {'loss': 0.6149723529815674, 'step': 635},\n",
              "  {'loss': 0.26099756360054016, 'step': 636},\n",
              "  {'loss': 0.13499774038791656, 'step': 637},\n",
              "  {'loss': 0.3679017424583435, 'step': 638},\n",
              "  {'loss': 0.5819692611694336, 'step': 639},\n",
              "  {'loss': 0.6513022184371948, 'step': 640},\n",
              "  {'loss': 0.7749361395835876, 'step': 641},\n",
              "  {'loss': 0.34314972162246704, 'step': 642},\n",
              "  {'loss': 0.3022429645061493, 'step': 643},\n",
              "  {'loss': 0.5155763030052185, 'step': 644},\n",
              "  {'loss': 0.4446307420730591, 'step': 645},\n",
              "  {'loss': 0.6017313003540039, 'step': 646},\n",
              "  {'loss': 0.2536245882511139, 'step': 647},\n",
              "  {'loss': 0.6389007568359375, 'step': 648},\n",
              "  {'loss': 0.24477994441986084, 'step': 649},\n",
              "  {'loss': 1.0557454824447632, 'step': 650},\n",
              "  {'loss': 0.4454891085624695, 'step': 651},\n",
              "  {'loss': 0.16288375854492188, 'step': 652},\n",
              "  {'loss': 0.3417866826057434, 'step': 653},\n",
              "  {'loss': 0.4184330999851227, 'step': 654},\n",
              "  {'loss': 0.5382910966873169, 'step': 655},\n",
              "  {'loss': 0.388808935880661, 'step': 656},\n",
              "  {'loss': 0.2501201033592224, 'step': 657},\n",
              "  {'loss': 0.3319508135318756, 'step': 658},\n",
              "  {'loss': 0.6295475959777832, 'step': 659},\n",
              "  {'loss': 0.26815879344940186, 'step': 660},\n",
              "  {'loss': 0.9633572101593018, 'step': 661},\n",
              "  {'loss': 0.3198533058166504, 'step': 662},\n",
              "  {'loss': 0.2595284581184387, 'step': 663},\n",
              "  {'loss': 0.2648313343524933, 'step': 664},\n",
              "  {'loss': 0.4644396901130676, 'step': 665},\n",
              "  {'loss': 0.1552373468875885, 'step': 666},\n",
              "  {'loss': 0.5665974617004395, 'step': 667},\n",
              "  {'loss': 0.46822431683540344, 'step': 668},\n",
              "  {'loss': 0.27165040373802185, 'step': 669},\n",
              "  {'loss': 0.3227764368057251, 'step': 670},\n",
              "  {'loss': 0.24841554462909698, 'step': 671},\n",
              "  {'loss': 0.3214051127433777, 'step': 672},\n",
              "  {'loss': 1.5253084897994995, 'step': 673},\n",
              "  {'loss': 0.26904934644699097, 'step': 674},\n",
              "  {'loss': 0.6990171670913696, 'step': 675},\n",
              "  {'loss': 0.11615557968616486, 'step': 676},\n",
              "  {'loss': 0.37720221281051636, 'step': 677},\n",
              "  {'loss': 1.4322295188903809, 'step': 678},\n",
              "  {'loss': 0.4077373743057251, 'step': 679},\n",
              "  {'loss': 0.19676947593688965, 'step': 680},\n",
              "  {'loss': 0.968113899230957, 'step': 681},\n",
              "  {'loss': 0.703705906867981, 'step': 682},\n",
              "  {'loss': 0.36194148659706116, 'step': 683},\n",
              "  {'loss': 0.553044855594635, 'step': 684},\n",
              "  {'loss': 0.32995733618736267, 'step': 685},\n",
              "  {'loss': 0.9822965860366821, 'step': 686},\n",
              "  {'loss': 0.5591046810150146, 'step': 687},\n",
              "  {'loss': 0.15159189701080322, 'step': 688},\n",
              "  {'loss': 0.3212957978248596, 'step': 689},\n",
              "  {'loss': 0.33216366171836853, 'step': 690},\n",
              "  {'loss': 0.28597137331962585, 'step': 691},\n",
              "  {'loss': 0.558911919593811, 'step': 692},\n",
              "  {'loss': 0.4085465371608734, 'step': 693},\n",
              "  {'loss': 0.25794821977615356, 'step': 694},\n",
              "  {'loss': 0.696330189704895, 'step': 695},\n",
              "  {'loss': 0.2028409242630005, 'step': 696},\n",
              "  {'loss': 0.22746549546718597, 'step': 697},\n",
              "  {'loss': 0.2604922950267792, 'step': 698},\n",
              "  {'loss': 0.2409881204366684, 'step': 699},\n",
              "  {'loss': 0.5159086585044861, 'step': 700},\n",
              "  {'loss': 0.7393203377723694, 'step': 701},\n",
              "  {'loss': 0.33215636014938354, 'step': 702},\n",
              "  {'loss': 0.3843744099140167, 'step': 703},\n",
              "  {'loss': 0.5176825523376465, 'step': 704},\n",
              "  {'loss': 0.7279832363128662, 'step': 705},\n",
              "  {'loss': 0.7530779838562012, 'step': 706},\n",
              "  {'loss': 0.9353023767471313, 'step': 707},\n",
              "  {'loss': 0.27885565161705017, 'step': 708},\n",
              "  {'loss': 0.13311871886253357, 'step': 709},\n",
              "  {'loss': 0.1941971480846405, 'step': 710},\n",
              "  {'loss': 1.4573974609375, 'step': 711},\n",
              "  {'loss': 0.8665775060653687, 'step': 712},\n",
              "  {'loss': 0.43329155445098877, 'step': 713},\n",
              "  {'loss': 0.8008983135223389, 'step': 714},\n",
              "  {'loss': 0.2992135286331177, 'step': 715},\n",
              "  {'loss': 0.10440222918987274, 'step': 716},\n",
              "  {'loss': 0.8896971940994263, 'step': 717},\n",
              "  {'loss': 0.21232250332832336, 'step': 718},\n",
              "  {'loss': 0.14106601476669312, 'step': 719},\n",
              "  {'loss': 0.30926722288131714, 'step': 720},\n",
              "  {'loss': 0.7119413614273071, 'step': 721},\n",
              "  {'loss': 0.7797291278839111, 'step': 722},\n",
              "  {'loss': 1.1650702953338623, 'step': 723},\n",
              "  {'loss': 0.12305410206317902, 'step': 724},\n",
              "  {'loss': 0.6335932016372681, 'step': 725},\n",
              "  {'loss': 0.3069533109664917, 'step': 726},\n",
              "  {'loss': 0.5181686878204346, 'step': 727},\n",
              "  {'loss': 0.9792922139167786, 'step': 728},\n",
              "  {'loss': 0.38163620233535767, 'step': 729},\n",
              "  {'loss': 0.7105314135551453, 'step': 730},\n",
              "  {'loss': 0.21723070740699768, 'step': 731},\n",
              "  {'loss': 0.3432573080062866, 'step': 732},\n",
              "  {'loss': 0.5473818182945251, 'step': 733},\n",
              "  {'loss': 0.8176750540733337, 'step': 734},\n",
              "  {'loss': 0.36042967438697815, 'step': 735},\n",
              "  {'loss': 0.38919001817703247, 'step': 736},\n",
              "  {'loss': 0.3321007192134857, 'step': 737},\n",
              "  {'loss': 0.34372377395629883, 'step': 738},\n",
              "  {'loss': 0.39294934272766113, 'step': 739},\n",
              "  {'loss': 0.3215959966182709, 'step': 740},\n",
              "  {'loss': 0.8146909475326538, 'step': 741},\n",
              "  {'loss': 0.5555063486099243, 'step': 742},\n",
              "  {'loss': 1.1620962619781494, 'step': 743},\n",
              "  {'loss': 0.1990588754415512, 'step': 744},\n",
              "  {'loss': 0.42167750000953674, 'step': 745},\n",
              "  {'loss': 0.1485309600830078, 'step': 746},\n",
              "  {'loss': 0.3021949231624603, 'step': 747},\n",
              "  {'loss': 0.45743995904922485, 'step': 748},\n",
              "  {'loss': 0.19257766008377075, 'step': 749},\n",
              "  {'loss': 0.23913437128067017, 'step': 750},\n",
              "  {'loss': 0.18594534695148468, 'step': 751},\n",
              "  {'loss': 0.48944687843322754, 'step': 752},\n",
              "  {'loss': 0.5815052390098572, 'step': 753},\n",
              "  {'loss': 0.3425224721431732, 'step': 754},\n",
              "  {'loss': 0.5492873787879944, 'step': 755},\n",
              "  {'loss': 0.8991894721984863, 'step': 756},\n",
              "  {'loss': 1.5762327909469604, 'step': 757},\n",
              "  {'loss': 0.26101362705230713, 'step': 758},\n",
              "  {'loss': 0.3444691300392151, 'step': 759},\n",
              "  {'loss': 0.24690622091293335, 'step': 760},\n",
              "  {'loss': 0.4181917607784271, 'step': 761},\n",
              "  {'loss': 0.4468494951725006, 'step': 762},\n",
              "  {'loss': 0.8973394632339478, 'step': 763},\n",
              "  {'loss': 0.7918838262557983, 'step': 764},\n",
              "  {'loss': 0.3603905439376831, 'step': 765},\n",
              "  {'loss': 1.1307401657104492, 'step': 766},\n",
              "  {'loss': 0.5027558207511902, 'step': 767},\n",
              "  {'loss': 0.14795060455799103, 'step': 768},\n",
              "  {'loss': 0.41244304180145264, 'step': 769},\n",
              "  {'loss': 0.1824527382850647, 'step': 770},\n",
              "  {'loss': 0.2847648561000824, 'step': 771},\n",
              "  {'loss': 0.23869727551937103, 'step': 772},\n",
              "  {'loss': 0.3846610188484192, 'step': 773},\n",
              "  {'loss': 0.07820949703454971, 'step': 774},\n",
              "  {'loss': 0.34813791513442993, 'step': 775},\n",
              "  {'loss': 0.577235758304596, 'step': 776},\n",
              "  {'loss': 0.48024964332580566, 'step': 777},\n",
              "  {'loss': 1.14889657497406, 'step': 778},\n",
              "  {'loss': 0.5209037065505981, 'step': 779},\n",
              "  {'loss': 0.17984041571617126, 'step': 780},\n",
              "  {'loss': 0.200027734041214, 'step': 781},\n",
              "  {'loss': 0.29913532733917236, 'step': 782},\n",
              "  {'loss': 0.5846326351165771, 'step': 783},\n",
              "  {'loss': 0.2072693109512329, 'step': 784},\n",
              "  {'loss': 0.32928162813186646, 'step': 785},\n",
              "  {'loss': 0.7525903582572937, 'step': 786},\n",
              "  {'loss': 0.3807199001312256, 'step': 787},\n",
              "  {'loss': 0.25487861037254333, 'step': 788},\n",
              "  {'loss': 0.4069572389125824, 'step': 789},\n",
              "  {'loss': 0.7342904806137085, 'step': 790},\n",
              "  {'loss': 0.35417479276657104, 'step': 791},\n",
              "  {'loss': 0.7532671689987183, 'step': 792},\n",
              "  {'loss': 0.13871052861213684, 'step': 793},\n",
              "  {'loss': 0.17922081053256989, 'step': 794},\n",
              "  {'loss': 0.2907682955265045, 'step': 795},\n",
              "  {'loss': 0.08867808431386948, 'step': 796},\n",
              "  {'loss': 0.6615995168685913, 'step': 797},\n",
              "  {'loss': 0.4730183482170105, 'step': 798},\n",
              "  {'loss': 0.7136479616165161, 'step': 799},\n",
              "  {'loss': 0.43907976150512695, 'step': 800},\n",
              "  {'loss': 0.5945374369621277, 'step': 801},\n",
              "  {'loss': 0.24405068159103394, 'step': 802},\n",
              "  {'loss': 0.4383755028247833, 'step': 803},\n",
              "  {'loss': 0.37499797344207764, 'step': 804},\n",
              "  {'loss': 0.16829432547092438, 'step': 805},\n",
              "  {'loss': 0.5998436212539673, 'step': 806},\n",
              "  {'loss': 0.7448855042457581, 'step': 807},\n",
              "  {'loss': 1.1937081813812256, 'step': 808},\n",
              "  {'loss': 1.0681450366973877, 'step': 809},\n",
              "  {'loss': 0.5499191284179688, 'step': 810},\n",
              "  {'loss': 0.28505194187164307, 'step': 811},\n",
              "  {'loss': 0.855751633644104, 'step': 812},\n",
              "  {'loss': 0.8425122499465942, 'step': 813},\n",
              "  {'loss': 0.674356997013092, 'step': 814},\n",
              "  {'loss': 0.19383367896080017, 'step': 815},\n",
              "  {'loss': 0.8378061056137085, 'step': 816},\n",
              "  {'loss': 0.7234811782836914, 'step': 817},\n",
              "  {'loss': 0.4943130612373352, 'step': 818},\n",
              "  {'loss': 0.35509803891181946, 'step': 819},\n",
              "  {'loss': 0.18681973218917847, 'step': 820},\n",
              "  {'loss': 0.29937678575515747, 'step': 821},\n",
              "  {'loss': 0.7305374145507812, 'step': 822},\n",
              "  {'loss': 0.42203569412231445, 'step': 823},\n",
              "  {'loss': 0.6042859554290771, 'step': 824},\n",
              "  {'loss': 0.3228837549686432, 'step': 825},\n",
              "  {'loss': 0.43544915318489075, 'step': 826},\n",
              "  {'loss': 0.7741960287094116, 'step': 827},\n",
              "  {'loss': 0.6311883926391602, 'step': 828},\n",
              "  {'loss': 0.8393948674201965, 'step': 829},\n",
              "  {'loss': 0.2416258454322815, 'step': 830},\n",
              "  {'loss': 0.15462550520896912, 'step': 831},\n",
              "  {'loss': 0.6778066754341125, 'step': 832},\n",
              "  {'loss': 0.3186395466327667, 'step': 833},\n",
              "  {'loss': 0.8947581052780151, 'step': 834},\n",
              "  {'loss': 0.6226520538330078, 'step': 835},\n",
              "  {'loss': 0.6192929744720459, 'step': 836},\n",
              "  {'loss': 0.35849523544311523, 'step': 837},\n",
              "  {'loss': 0.5834587812423706, 'step': 838},\n",
              "  {'loss': 0.6087785959243774, 'step': 839},\n",
              "  {'loss': 0.23675942420959473, 'step': 840},\n",
              "  {'loss': 0.22317560017108917, 'step': 841},\n",
              "  {'loss': 1.278048038482666, 'step': 842},\n",
              "  {'loss': 0.22705033421516418, 'step': 843},\n",
              "  {'loss': 0.40735265612602234, 'step': 844},\n",
              "  {'loss': 1.0986217260360718, 'step': 845},\n",
              "  {'loss': 0.45853060483932495, 'step': 846},\n",
              "  {'loss': 0.25707024335861206, 'step': 847},\n",
              "  {'loss': 0.5301960706710815, 'step': 848},\n",
              "  {'loss': 0.707362711429596, 'step': 849},\n",
              "  {'loss': 0.24649760127067566, 'step': 850},\n",
              "  {'loss': 0.32014352083206177, 'step': 851},\n",
              "  {'loss': 0.3678387403488159, 'step': 852},\n",
              "  {'loss': 0.20813429355621338, 'step': 853},\n",
              "  {'loss': 0.28805214166641235, 'step': 854},\n",
              "  {'loss': 0.48244041204452515, 'step': 855},\n",
              "  {'loss': 0.21986716985702515, 'step': 856},\n",
              "  {'loss': 0.2536155879497528, 'step': 857},\n",
              "  {'loss': 0.6569532752037048, 'step': 858},\n",
              "  {'loss': 1.0895519256591797, 'step': 859},\n",
              "  {'loss': 0.7762057781219482, 'step': 860},\n",
              "  {'loss': 0.7779653072357178, 'step': 861},\n",
              "  {'loss': 0.5200437307357788, 'step': 862},\n",
              "  {'loss': 0.3158952593803406, 'step': 863},\n",
              "  {'loss': 0.2048247903585434, 'step': 864},\n",
              "  {'loss': 0.5109580159187317, 'step': 865},\n",
              "  {'loss': 0.4008871912956238, 'step': 866},\n",
              "  {'loss': 0.41210222244262695, 'step': 867},\n",
              "  {'loss': 0.1271231472492218, 'step': 868},\n",
              "  {'loss': 0.16694305837154388, 'step': 869},\n",
              "  {'loss': 0.5374548435211182, 'step': 870},\n",
              "  {'loss': 1.0009913444519043, 'step': 871},\n",
              "  {'loss': 0.3520078659057617, 'step': 872},\n",
              "  {'loss': 0.28799545764923096, 'step': 873},\n",
              "  {'loss': 0.3872852325439453, 'step': 874},\n",
              "  {'loss': 0.9332970976829529, 'step': 875},\n",
              "  {'loss': 0.49400463700294495, 'step': 876},\n",
              "  {'loss': 0.17411629855632782, 'step': 877},\n",
              "  {'loss': 0.5803185701370239, 'step': 878},\n",
              "  {'loss': 0.6934306621551514, 'step': 879},\n",
              "  {'loss': 0.26932474970817566, 'step': 880},\n",
              "  {'loss': 0.35907888412475586, 'step': 881},\n",
              "  {'loss': 0.13088056445121765, 'step': 882},\n",
              "  {'loss': 0.4421769380569458, 'step': 883},\n",
              "  {'loss': 0.3963117301464081, 'step': 884},\n",
              "  {'loss': 0.20839577913284302, 'step': 885},\n",
              "  {'loss': 0.21024218201637268, 'step': 886},\n",
              "  {'loss': 0.20828840136528015, 'step': 887},\n",
              "  {'loss': 0.5561593770980835, 'step': 888},\n",
              "  {'loss': 0.24216072261333466, 'step': 889},\n",
              "  {'loss': 1.505596399307251, 'step': 890},\n",
              "  {'loss': 0.3490775227546692, 'step': 891},\n",
              "  {'loss': 0.6244056224822998, 'step': 892},\n",
              "  {'loss': 0.4852122664451599, 'step': 893},\n",
              "  {'loss': 0.38805675506591797, 'step': 894},\n",
              "  {'loss': 0.7388446927070618, 'step': 895},\n",
              "  {'loss': 0.6524841785430908, 'step': 896},\n",
              "  {'loss': 1.0272704362869263, 'step': 897},\n",
              "  {'loss': 0.2233022153377533, 'step': 898},\n",
              "  {'loss': 0.29873037338256836, 'step': 899},\n",
              "  {'loss': 0.11223325878381729, 'step': 900},\n",
              "  {'loss': 0.38006818294525146, 'step': 901},\n",
              "  {'loss': 0.23065616190433502, 'step': 902},\n",
              "  {'loss': 0.6793813705444336, 'step': 903},\n",
              "  {'loss': 3.307480812072754, 'step': 904},\n",
              "  {'loss': 0.3909359276294708, 'step': 905},\n",
              "  {'loss': 0.3104400038719177, 'step': 906},\n",
              "  {'loss': 0.30370619893074036, 'step': 907},\n",
              "  {'loss': 0.4580758810043335, 'step': 908},\n",
              "  {'loss': 0.18456339836120605, 'step': 909},\n",
              "  {'loss': 0.5979301333427429, 'step': 910},\n",
              "  {'loss': 0.7534530162811279, 'step': 911},\n",
              "  {'loss': 0.4570314288139343, 'step': 912},\n",
              "  {'loss': 0.23352408409118652, 'step': 913},\n",
              "  {'loss': 0.7142646908760071, 'step': 914},\n",
              "  {'loss': 0.683870792388916, 'step': 915},\n",
              "  {'loss': 0.5735916495323181, 'step': 916},\n",
              "  {'loss': 0.10263475775718689, 'step': 917},\n",
              "  {'loss': 0.44260627031326294, 'step': 918},\n",
              "  {'loss': 0.5653403401374817, 'step': 919},\n",
              "  {'loss': 0.5806402564048767, 'step': 920},\n",
              "  {'loss': 0.3461020290851593, 'step': 921},\n",
              "  {'loss': 0.9412310123443604, 'step': 922},\n",
              "  {'loss': 0.24634426832199097, 'step': 923},\n",
              "  {'loss': 0.452056348323822, 'step': 924},\n",
              "  {'loss': 0.3198933005332947, 'step': 925},\n",
              "  {'loss': 0.483964741230011, 'step': 926},\n",
              "  {'loss': 0.6474255323410034, 'step': 927},\n",
              "  {'loss': 0.2682633399963379, 'step': 928},\n",
              "  {'loss': 0.2321608066558838, 'step': 929},\n",
              "  {'loss': 0.47953805327415466, 'step': 930},\n",
              "  {'loss': 0.4145573377609253, 'step': 931},\n",
              "  {'loss': 0.6736330986022949, 'step': 932},\n",
              "  {'loss': 0.21477168798446655, 'step': 933},\n",
              "  {'loss': 0.3278179168701172, 'step': 934},\n",
              "  {'loss': 0.38102591037750244, 'step': 935},\n",
              "  {'loss': 0.2902640402317047, 'step': 936},\n",
              "  {'loss': 0.5500426888465881, 'step': 937},\n",
              "  {'loss': 0.23856261372566223, 'step': 938},\n",
              "  {'loss': 0.568770170211792, 'step': 939},\n",
              "  {'loss': 0.8341353535652161, 'step': 940},\n",
              "  {'loss': 0.43163299560546875, 'step': 941},\n",
              "  {'loss': 0.35693734884262085, 'step': 942},\n",
              "  {'loss': 0.27883222699165344, 'step': 943},\n",
              "  {'loss': 0.6344298124313354, 'step': 944},\n",
              "  {'loss': 0.2088000476360321, 'step': 945},\n",
              "  {'loss': 1.0510263442993164, 'step': 946},\n",
              "  {'loss': 0.4112964868545532, 'step': 947},\n",
              "  {'loss': 0.2192791998386383, 'step': 948},\n",
              "  {'loss': 0.48238685727119446, 'step': 949},\n",
              "  {'loss': 0.12691046297550201, 'step': 950},\n",
              "  {'loss': 0.28038644790649414, 'step': 951},\n",
              "  {'loss': 0.6910955905914307, 'step': 952},\n",
              "  {'loss': 0.6632509231567383, 'step': 953},\n",
              "  {'loss': 0.2720896601676941, 'step': 954},\n",
              "  {'loss': 0.3319709300994873, 'step': 955},\n",
              "  {'loss': 1.1726106405258179, 'step': 956},\n",
              "  {'loss': 0.42024725675582886, 'step': 957},\n",
              "  {'loss': 0.1690521240234375, 'step': 958},\n",
              "  {'loss': 0.42003142833709717, 'step': 959},\n",
              "  {'loss': 0.26279497146606445, 'step': 960},\n",
              "  {'loss': 0.22060205042362213, 'step': 961},\n",
              "  {'loss': 0.5361762046813965, 'step': 962},\n",
              "  {'loss': 0.5326375961303711, 'step': 963},\n",
              "  {'loss': 0.6296201944351196, 'step': 964},\n",
              "  {'loss': 0.7685781121253967, 'step': 965},\n",
              "  {'loss': 0.12933038175106049, 'step': 966},\n",
              "  {'loss': 0.30654892325401306, 'step': 967},\n",
              "  {'loss': 0.3072696328163147, 'step': 968},\n",
              "  {'loss': 0.4373120665550232, 'step': 969},\n",
              "  {'loss': 0.28050199151039124, 'step': 970},\n",
              "  {'loss': 0.27111580967903137, 'step': 971},\n",
              "  {'loss': 0.6769304275512695, 'step': 972},\n",
              "  {'loss': 1.0201096534729004, 'step': 973},\n",
              "  {'loss': 1.5757973194122314, 'step': 974},\n",
              "  {'loss': 0.5146244764328003, 'step': 975},\n",
              "  {'loss': 0.727126955986023, 'step': 976},\n",
              "  {'loss': 0.22379997372627258, 'step': 977},\n",
              "  {'loss': 0.4454154670238495, 'step': 978},\n",
              "  {'loss': 0.6026875972747803, 'step': 979},\n",
              "  {'loss': 0.43182557821273804, 'step': 980},\n",
              "  {'loss': 0.4702306091785431, 'step': 981},\n",
              "  {'loss': 0.2792682647705078, 'step': 982},\n",
              "  {'loss': 0.2460273802280426, 'step': 983},\n",
              "  {'loss': 0.39836448431015015, 'step': 984},\n",
              "  {'loss': 0.40791791677474976, 'step': 985},\n",
              "  {'loss': 0.5745878219604492, 'step': 986},\n",
              "  {'loss': 0.163808211684227, 'step': 987},\n",
              "  {'loss': 0.31814631819725037, 'step': 988},\n",
              "  {'loss': 0.5256215333938599, 'step': 989},\n",
              "  {'loss': 0.7643674612045288, 'step': 990},\n",
              "  {'loss': 0.5081964731216431, 'step': 991},\n",
              "  {'loss': 0.1681416630744934, 'step': 992},\n",
              "  {'loss': 0.3745776414871216, 'step': 993},\n",
              "  {'loss': 0.4210449457168579, 'step': 994},\n",
              "  {'loss': 0.5837563872337341, 'step': 995},\n",
              "  {'loss': 0.24076133966445923, 'step': 996},\n",
              "  {'loss': 0.2572581171989441, 'step': 997},\n",
              "  {'loss': 13.193315505981445, 'step': 998},\n",
              "  {'loss': 0.31770914793014526, 'step': 999},\n",
              "  ...],\n",
              " 'val': [{'loss': 5.593330285765908, 'step': 0},\n",
              "  {'loss': 0.5358956547315455, 'step': 726},\n",
              "  {'loss': 0.4695442755483399, 'step': 1452},\n",
              "  {'loss': 0.4478825307643611, 'step': 2178},\n",
              "  {'loss': 0.42064773839367325, 'step': 2904},\n",
              "  {'loss': 0.42034210055327614, 'step': 3630},\n",
              "  {'loss': 0.40223422221654703, 'step': 4356},\n",
              "  {'loss': 0.4157613925327939, 'step': 5082},\n",
              "  {'loss': 0.4020861247323515, 'step': 5808},\n",
              "  {'loss': 0.38801928043119177, 'step': 6534},\n",
              "  {'loss': 0.3866449146539219, 'step': 7260},\n",
              "  {'loss': 0.38137988850843807, 'step': 7986},\n",
              "  {'loss': 0.3805869802647878, 'step': 8712},\n",
              "  {'loss': 0.3731964088606933, 'step': 9438},\n",
              "  {'loss': 0.3699854802925232, 'step': 10164},\n",
              "  {'loss': 0.3641350333355675, 'step': 10890},\n",
              "  {'loss': 0.3598299113002198, 'step': 11616},\n",
              "  {'loss': 0.3579533317488087, 'step': 12342},\n",
              "  {'loss': 0.3698074753003672, 'step': 13068},\n",
              "  {'loss': 0.3491914195647417, 'step': 13794},\n",
              "  {'loss': 0.348550522191958, 'step': 14520},\n",
              "  {'loss': 0.34508690622843, 'step': 15246},\n",
              "  {'loss': 0.3407104907572762, 'step': 15972},\n",
              "  {'loss': 0.3379435382229238, 'step': 16698},\n",
              "  {'loss': 0.35658120650274694, 'step': 17424},\n",
              "  {'loss': 0.3561833006106625, 'step': 18150},\n",
              "  {'loss': 0.33653482964093034, 'step': 18876},\n",
              "  {'loss': 0.33456610381787966, 'step': 19602},\n",
              "  {'loss': 0.34207327075856775, 'step': 20328},\n",
              "  {'loss': 0.33123519833484466, 'step': 21054},\n",
              "  {'loss': 0.3406444181926733, 'step': 21780},\n",
              "  {'loss': 0.3548286136640005, 'step': 22506},\n",
              "  {'loss': 0.3314097608970709, 'step': 23232},\n",
              "  {'loss': 0.33480755603017887, 'step': 23958},\n",
              "  {'loss': 0.33189743898870533, 'step': 24684},\n",
              "  {'loss': 0.33940484654928044, 'step': 25410},\n",
              "  {'loss': 0.33577301236223583, 'step': 26136},\n",
              "  {'loss': 0.32650722594054277, 'step': 26862},\n",
              "  {'loss': 0.3319451202415238, 'step': 27588},\n",
              "  {'loss': 0.33200679765629376, 'step': 28314},\n",
              "  {'loss': 0.33106563706720665, 'step': 29040},\n",
              "  {'loss': 0.3250439031557603, 'step': 29766},\n",
              "  {'loss': 0.3381557268021274, 'step': 30492},\n",
              "  {'loss': 0.3275958593041936, 'step': 31218},\n",
              "  {'loss': 0.3311519266591092, 'step': 31944},\n",
              "  {'loss': 0.32208935673202366, 'step': 32670},\n",
              "  {'loss': 0.3184803352067786, 'step': 33396},\n",
              "  {'loss': 0.3191987559014608, 'step': 34122},\n",
              "  {'loss': 0.31720183412582914, 'step': 34848},\n",
              "  {'loss': 0.31667076243657216, 'step': 35574},\n",
              "  {'loss': 0.3166702008413628, 'step': 36300},\n",
              "  {'loss': 0.3190525224324593, 'step': 37026},\n",
              "  {'loss': 0.3162539079015659, 'step': 37752},\n",
              "  {'loss': 0.3180765250374463, 'step': 38478},\n",
              "  {'loss': 0.3180665259118661, 'step': 39204},\n",
              "  {'loss': 0.3133968807418238, 'step': 39930},\n",
              "  {'loss': 0.3158260934085639, 'step': 40656},\n",
              "  {'loss': 0.3248329631491633, 'step': 41382},\n",
              "  {'loss': 0.31858025392717565, 'step': 42108},\n",
              "  {'loss': 0.3164927585681608, 'step': 42834},\n",
              "  {'loss': 0.32137716937163646, 'step': 43560},\n",
              "  {'loss': 0.316195409160015, 'step': 44286},\n",
              "  {'loss': 0.32787418910417676, 'step': 45012},\n",
              "  {'loss': 0.3115344715019888, 'step': 45738},\n",
              "  {'loss': 0.31356406293439965, 'step': 46464},\n",
              "  {'loss': 0.3110533034936948, 'step': 47190},\n",
              "  {'loss': 0.36707404817739303, 'step': 47916},\n",
              "  {'loss': 0.31289086232254326, 'step': 48642},\n",
              "  {'loss': 0.3261858917126232, 'step': 49368},\n",
              "  {'loss': 0.3107605141795371, 'step': 50094},\n",
              "  {'loss': 0.31166675268125926, 'step': 50820},\n",
              "  {'loss': 0.3128971073099158, 'step': 51546},\n",
              "  {'loss': 0.3157229851469521, 'step': 52272},\n",
              "  {'loss': 0.31432570372361784, 'step': 52998}]}"
            ]
          },
          "metadata": {},
          "execution_count": 15
        }
      ],
      "source": [
        "record"
      ],
      "metadata": {
        "collapsed": true,
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "jJOF_KLArXyb",
        "outputId": "586bfc05-6830-47c8-94f0-b0fa9e5c236e"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:41:09.033660300Z",
          "start_time": "2024-07-18T03:41:08.799715800Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 449
        },
        "id": "5YQa80YTrXyb",
        "outputId": "4a2c8710-7c1f-47b8-c711-4de4f64b45e2"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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wcyZMyEIAp599tk2yTw05o9//COGDx+Ol156Cffeey927dqFd999F++//z4A4IcffsD58+cxfvx4hIWFYc2aNXA4HOjduzf27NmDDRs2YOrUqYiOjsaePXtQUFCAvn37tmmbVZOxADMWRETUTE888QS0Wi369euHqKioRmsm3njjDYSFhWHMmDGYOXMmpk2bhiFDhnitnUOGDMGXX36JlStXYsCAAXjuuefw4osvYt68eQCA0NBQfPPNN5g4cSL69u2LDz/8ECtWrED//v1hMpmwdetWzJgxA7169cKf//xn/O1vf8P06dPbtM3qy1gwsCAioqvo1asXdu3a5XadfLJ2lZSUpAwryObPn+/2c92hkYamc5aUlMDhcKCsrKzJdk2YMKHe399111246667Gjx+3Lhx2Lx5c4O/69u3L9atW9fk/bUFFWUs5KEQBhZERES+op7AQsvAgoiI2rc//OEPMJlMCAoKqnd55JFHfN08j1DPUAhX3iQionbumWeewaJFi6DR1P9cbzKZfNAiz1NPYKFl8SYREbVvUVFRMJlMDQYWaqGeR8YaCyIiIp9TUWAhZyw4FEJEROQrqgksRBZvEhER+ZxqAgtlKIQZCyIiIp9RT2AhF29y23QiIiKfUVFgYZC+clYIERG1saSkJLz55pvNOlYQBHz77bdt2p72RD2BhVy8yU3IiIiIfEZFgQX3CiEiIvI19QQWzlkhAjMWRES+I4qApdI3lwY2/2rI3//+d8THx9fb/vz222/HL37xC5w7dw633347YmJiEBQUhOHDh+Onn37yWBcdO3YMEydOhL+/PyIiIvDrX/8aFRUVyu83b96MESNGIDAwEKGhoRg7diwuXLgAADhy5AhuuukmBAcHw2QyYejQodi/f7/H2uYJ6ll5k9umExH5nrUKeCXeN/f9zGXAEHjVw2bPno3HHnsMmzZtwqRJkwAARUVFWLduHdasWYOKigrMmDEDL7/8MoxGIz799FPMnDkT6enp6Ny58zU1sbKyEtOnT8fo0aOxb98+5Ofn4+GHH8aCBQuwbNky2Gw23HHHHfjVr36FFStWwGKxYO/evRAEAQAwd+5cDB48GB988AG0Wi0OHz4MvV5/TW3yNPUEFtw2nYiImiEsLAzTp0/H8uXLlcDi66+/RmRkJG666SZoNBqkpKQox7/00ktYtWoVvv/+eyxY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vx5dbz2K68XNA+IwrX8sgwoiL2hxYPHFF19g4cKFeP7553Hw4EGkpKRg2rRpyM9v3pKmREREpF4tDizeeOMN/OpXv8JDDz2Efv364cMPP0RAQAA++eSTtmgfERERdSAtyotaLBYcOHAAixYtUq7TaDSYPHkydu3a1eDfmM1mmM21u1GWlUlrFFitVlitjW9R21LybXnyNq937FPPY596HvvU89inbaOj92tz292iwKKwsBB2ux0xMe614TExMTh16lSDf7NkyRIsXry43vXr169HQIDn57anpqZ6/Davd+xTz2Ofeh771PPYp22jo/ZrVVVVs45r80quRYsWYeHChcrPZWVlSExMxNSpU2EyeW6NAavVitTUVEyZMsVr6wOoHfvU89innsc+9Tz2advo6P0qjzhcTYsCi8jISGi1WuTl5bldn5eXh9jY2Ab/xmg0wmisv0CTXq9vk45tq9u9nrFPPY996nnsU89jn7aNjtqvzW1zi4o3DQYDhg4dig0bNijXORwObNiwAaNHj25ZC4mIiEh1WjwUsnDhQjz44IMYNmwYRowYgTfffBOVlZV46KGH2qJ9RERE1IG0OLC49957UVBQgOeeew65ubkYNGgQ1q1bV6+gk4iIiK4/rSreXLBgARYsWODpthAREVEH1zZbDhIREdF1iYEFEREReQwDCyIiIvIYBhZERETkMV7fQ1kURQDNX8GruaxWK6qqqlBWVtYhFx5pj9innsc+9Tz2qeexT9tGR+9X+bwtn8cb4/XAory8HACQmJjo7bsmIiKia1ReXo6QkJBGfy+IVws9PMzhcODy5csIDg6GIAgeu115D5Ls7GyP7kFyPWOfeh771PPYp57HPm0bHb1fRVFEeXk54uPjodE0Xknh9YyFRqNBp06d2uz2TSZTh3zC2jP2qeexTz2Pfep57NO20ZH7talMhYzFm0REROQxDCyIiIjIY1QTWBiNRjz//PMNbtFOrcM+9Tz2qeexTz2Pfdo2rpd+9XrxJhEREamXajIWRERE5HsMLIiIiMhjGFgQERGRxzCwICIiIo9RTWDx3nvvISkpCX5+fhg5ciT27t3r6yb5xNatWzFz5kzEx8dDEAR8++23br8XRRHPPfcc4uLi4O/vj8mTJ+PMmTNuxxQVFWHu3LkwmUwIDQ3FL3/5S1RUVLgdc/ToUdxwww3w8/NDYmIi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\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "#画线要注意的是损失是不一定在零到1之间的\n",
        "def plot_learning_curves(record_dict, sample_step=500):\n",
        "    # build DataFrame\n",
        "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
        "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
        "\n",
        "    # plot\n",
        "    for idx, item in enumerate(train_df.columns):\n",
        "        plt.plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
        "        plt.plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
        "        plt.grid()\n",
        "        plt.legend()\n",
        "        # plt.xticks(range(0, train_df.index[-1], 10*sample_step), range(0, train_df.index[-1], 10*sample_step))\n",
        "        plt.xlabel(\"step\")\n",
        "\n",
        "        plt.show()\n",
        "\n",
        "plot_learning_curves(record)  #横坐标是 steps"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XAisSFU5rXyb"
      },
      "source": [
        "## 测试集"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T03:41:12.191677100Z",
          "start_time": "2024-07-18T03:41:12.105840300Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "MGKBz5EirXyb",
        "outputId": "325129c4-8afb-468f-913f-137f9e824c42"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "loss:     0.3190\n"
          ]
        }
      ],
      "source": [
        "model.eval()\n",
        "loss = evaluating(model, test_loader, loss_fct)\n",
        "print(f\"loss:     {loss:.4f}\")"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.10.8"
    },
    "orig_nbformat": 4,
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "accelerator": "GPU",
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "97f3b6361ad94750914302b96c8d5734": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_297e93d2aee24205be4516278ed097e4",
              "IPY_MODEL_f1c5a8b822094702ad691b29c411de18",
              "IPY_MODEL_feabee3ef3aa4d52be49b18262aaabfb"
            ],
            "layout": "IPY_MODEL_8d906e7188fc495fb041a55db73b33aa"
          }
        },
        "297e93d2aee24205be4516278ed097e4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_9480724ea65c47388f313f66c716d9d1",
            "placeholder": "​",
            "style": "IPY_MODEL_367b45ae77f24737bdbbd870c1f1582a",
            "value": " 73%"
          }
        },
        "f1c5a8b822094702ad691b29c411de18": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "danger",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_9e6f5c8d83654cc4ad5525ba2919df80",
            "max": 72600,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_757f498293d846279e2dccaa780dbe89",
            "value": 52998
          }
        },
        "feabee3ef3aa4d52be49b18262aaabfb": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_7ee5c0305cb64bbeaa09e4aa03c680a3",
            "placeholder": "​",
            "style": "IPY_MODEL_be30ed89380f4e12a73dfc18548a3327",
            "value": " 52998/72600 [04:11&lt;01:24, 232.19it/s, epoch=72]"
          }
        },
        "8d906e7188fc495fb041a55db73b33aa": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "9480724ea65c47388f313f66c716d9d1": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "367b45ae77f24737bdbbd870c1f1582a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "9e6f5c8d83654cc4ad5525ba2919df80": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "757f498293d846279e2dccaa780dbe89": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "7ee5c0305cb64bbeaa09e4aa03c680a3": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "be30ed89380f4e12a73dfc18548a3327": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        }
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}